(메모) Spring MVC 학습 지침파일 업로드

17909 단어 SpringMVC
Spring MVC 에서 파일 업 로드 를 처리 하 는 방법 은 두 가지 가 있 습 니 다. (1) Apache Commons FileUpload 소자 (2) 는 Servlet 3.0 과 더 높 은 버 전의 내장 지원 을 이용 합 니 다.Servlet 3.0 과 더 높 은 버 전 을 지원 하 는 용기 에 프로그램 을 배치 하려 면 이 방법 만 사용 할 수 있 습 니 다.어떤 방법 을 선택 하 든 이미 업로드 한 파일 을 같은 API 로 처리 해 야 한다.1. 클 라 이언 트 프로 그래 밍 은 파일 을 업로드 하기 위해 HTML 표 의 enctype 속성 값 을 multipart / form - data 로 설정 해 야 합 니 다. 아래 와 같이:
"action" enctype="multipart/form-data" method="post"> Select a file type="file" name="fieldName" /> type="submit" value="Upload" />

표 에는 file 형식의 input 요 소 를 포함 해 야 합 니 다. 단 추 를 누 르 면 파일 을 선택 하 는 대화 상 자 를 엽 니 다.HTML 5 이전에 여러 파일 을 업로드 하려 면 여러 파일 input 요 소 를 사용 해 야 합 니 다.그러나 HTML 5 에 서 는 input 요소 에 여러 개의 multiple 속성 을 도입 함으로써 여러 파일 의 업로드 가 더욱 쉬 워 집 니 다.HTML 5 에서 다음 줄 의 코드 를 작성 하면 여러 파일 을 선택 할 수 있 는 단 추 를 만 들 수 있 습 니 다.
type="file" name="fieldName" multiple/>
type="file" name="fieldName" multiple="multiple"/>
type="file" name="fieldName" multiple=""/>

2. MultipartFile 인 터 페 이 스 는 Spring MVC 에서 이미 업로드 한 파일 을 처리 하 는 것 이 매우 쉽다.Spring MVC 프로그램 에 올 린 파일 은 MultipartFile 대상 에 포 함 됩 니 다.유일한 임 무 는 MultipartFile 의 속성 으로 domain 클래스 를 만 드 는 것 입 니 다.org. springframework. web. multipatFile 인 터 페 이 스 는 다음 과 같은 방법 을 가지 고 있 습 니 다. byte [] getBytes () 는 바이트 배열 로 파일 의 내용 을 되 돌려 줍 니 다.String getContentType () 은 파일 의 내용 형식 을 되 돌려 줍 니 다.InputStream getInputStream () 은 InputStream 을 되 돌려 파일 의 내용 을 읽 습 니 다.String getName () 은 인자 의 이름 을 여러 부분 으로 되 돌려 줍 니 다.String getOriginal Filename () 클 라 이언 트 로 컬 드라이브 의 초기 파일 이름 을 되 돌려 줍 니 다.long getSize () 는 바이트 단위 로 파일 의 크기 를 되 돌려 줍 니 다.boolean isEmpty () 는 업 로드 된 파일 이 비어 있 는 지 여 부 를 표시 합 니 다.void transferTo (File destination) 는 업로드 한 파일 을 대상 디 렉 터 리 에 저장 합 니 다.3. Commons FileUpload 로 파일 을 업로드 하려 면 Spring MVC 설정 파일 에서 multipart Resolver bean 을 정의 해 야 합 니 다.
    id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="2000000" />
    

4. 도 메 인 류 는 유형 이 4. 567914 인 images 속성 을 가진다.
package app11a.domain;


import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

import org.springframework.web.multipart.MultipartFile;

import com.sun.istack.internal.NotNull;


public class Product implements Serializable
{

    private static final long serialVersionUID = -164834188493691288L;

    @NotNull
    @Size(min = 1, max = 10)
    private String name;

    @NotNull
    private String description;

    private Float price;

    @Past
    private Date productionDate;

    private List images;
    ...

5. 컨트롤 러 가 업로드 한 파일 을 저장 하 는 것 은 매우 쉬 운 일이 다. MultipartFile 에서 transferTo 방법 을 호출 하기 만 하면 된다.
package app11a.controller;


import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import app11a.domain.Product;


@Controller
public class ProductController
{

    private static final Log logger = LogFactory.getLog(ProductController.class);

    @RequestMapping(value = "/product_input")
    public String inputProduct(Model model)
    {
        model.addAttribute("product", new Product());
        return "ProductForm";
    }

    @RequestMapping(value = "/product_save")
    public String saveProduct(HttpServletRequest servletRequest,
                              @Valid @ModelAttribute Product product, BindingResult bindingResult,
                              Model model)
    {
        if (bindingResult.hasErrors())
        {
            FieldError fieldError = bindingResult.getFieldError();
            logger.info("Code:" + fieldError.getCode() + ",field:" + fieldError.getField());
            return "ProductForm";
        }
        List files = product.getImages();
        List fileNames = new ArrayList();
        if (null != files && files.size() > 0)
        {
            for (MultipartFile multipartFile : files)
            {
                String fileName = multipartFile.getOriginalFilename();
                fileNames.add(fileName);
                File imageFile = new File(getPath(servletRequest), fileName);
                try
                {
                    multipartFile.transferTo(imageFile);
                }
                catch (IllegalStateException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        // save product here
        model.addAttribute("product", product);
        return "ProductDetails";
    }

    private String getPath(HttpServletRequest servletRequest)
    {
        String pathUrl = servletRequest.getServletContext().getRealPath("/image");
        File path = new File(pathUrl);
        if (!path.exists() || !path.isDirectory())
        {
            path.mkdir();
        }
        return pathUrl;
    }

}

6. 프로필 은 multipartResolver bean 의 max UploadSize 속성 을 이용 하여 받 아들 일 수 있 는 최대 파일 용량 을 설정 할 수 있 습 니 다.이 속성 을 설정 하지 않 으 면 최대 파일 용량 제한 이 없습니다.파일 용량 에 제한 이 없다 고 해서 임의의 크기 의 파일 을 업로드 할 수 있 는 것 은 아니다.너무 큰 파일 을 업로드 하 는 데 시간 이 오래 걸 리 면 서버 가 시간 을 초과 할 수 있 습 니 다.초대형 파일 문 제 를 처리 하기 위해 서 는 HTML 5 File API 를 이용 해 파일 을 슬라이스 한 다음 각각 업로드 할 수 있다.9. Servlet 3 과 더 높 은 버 전 으로 파일 을 업로드 합 니 다. Servlet 3 이 있 으 면 Commons FileUpload 와 Commons IO 소자 가 필요 없습니다.Servlet 3 및 그 이상 버 전의 용기 에서 서버 엔 드 파일 을 업로드 하 는 프로 그래 밍 은 레이 블 형식 MultipartConfig 와 javax. servlet. http. Part 인 터 페 이 스 를 중심 으로 진행 되 었 습 니 다.업 로드 된 파일 을 처리 하 는 Servlets 는 @ MultipartConfig 로 표시 해 야 합 니 다.다음은 MultipartConfig 레이 블 형식 에 나타 날 수 있 는 속성 입 니 다. 모두 선택 할 수 있 습 니 다: max FileSize: 파일 업로드 의 최대 용량, 기본 값 은 - 1 로 제한 이 없 음 을 표시 합 니 다.지정 한 값 보다 큰 파일 은 거부 당 합 니 다.maxRequestSize: 여러 부분의 HTTP 요청 이 허용 하 는 최대 용량 을 표시 합 니 다. 기본 값 은 - 1 로 제한 이 없 음 을 표시 합 니 다.location: Part 에서 write 방법 을 호출 할 때 업로드 한 파일 을 디스크 에 저장 하 는 위 치 를 표시 합 니 다.fileSizeThreshold: 이 용량 의 경 계 를 초과 하여 파일 을 업로드 할 때 디스크 에 기 록 됩 니 다.Spring MVC 의 Dispatcher Servlet 은 대부분의 요청 이나 모든 요청 을 처리 합 니 다.안 타 깝 게 도 소스 코드 를 수정 하지 않 으 면 Servlet 에 표시 할 수 없습니다.그러나 다행스럽게도 Servlet 3 에는 Servlet 을 Multipart Config Servlet 으로 만 드 는 비교적 쉬 운 방법 이 있 습 니 다. 즉, 배치 설명자 (web. xml) 의 Servlet 성명 에 값 을 부여 할 수 있 습 니 다.다음 코드 는 @ MultipartConfig 로 Dispatcher Servlet 에 표시 하 는 효과 와 같 습 니 다.
    <servlet>
        <servlet-name>springmvc</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/springmvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <multipart-config>
            <max-file-size>20848820</max-file-size>
            <max-request-size>418018841</max-request-size>
            <file-size-threshold>1048576</file-size-threshold>
        </multipart-config>
    </servlet>

이 밖 에 Spring MVC 부품 파일 에 여러 부분 해석 기 를 사용 해 야 합 니 다. 아래 와 같이:
    id="multipartResolver"
    class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />

좋은 웹페이지 즐겨찾기