본문 바로가기

개인공부

MultiPartConfig 어노테이션

반응형
Annotation명 설명
@fileSizeThreshold fileUpload 시에 메모리에 저장되는 임시 파일 크기를 정의
[자료형 : int]
@location 파일 업로드 시에 임시 저장 디렉터리를 지정한다.
[자료형 : String]
@maxFileSize 업로드할 파일의 치대 크기를 지정한다.
[자료형 : long]
@maxRequestSize request 시에 최대 크기를 지정한다.
[자료형 : long]

 

package info.thecodinglive.upload;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;

@WebServlet(urlPatterns = "/upload", name = "uploadServlet")
@MultipartConfig(
        fileSizeThreshold = 1024 * 1024 * 2, // 2mb
        maxFileSize = 1024 * 1024 * 10, // 10mb
        maxRequestSize = 1024 * 1024 * 50, //50mb
        location = "c:/upload" //파일저장위치
)
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        //경로
        final String path = request.getParameter("destination");
        //파일
        final Part filePart = request.getPart("file");
        //파일이름
        final String fileName = getFileName(filePart);
        final PrintWriter writer = response.getWriter();

        try (OutputStream out = new FileOutputStream(new File(path + File.separator + fileName)); InputStream filecontent = filePart.getInputStream()) {
            int read = 0;
            final byte[] bytes = new byte[1024];

            while ((read = filecontent.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }

            writer.print("new File: " + fileName + path + "에 생성되었습니다.");

        } catch (FileNotFoundException fne) {
            System.out.println(fne.getMessage());
        }
    }


    private String getFileName(final Part part) {
        final String partHeader = part.getHeader("content-disposition");
        System.out.println("Part Header = {0}" + partHeader);
        for (String content: part.getHeader("content-disposition").split(";")) {
            if (content.trim().startsWith("filename")) {
                return content.substring(
                        content.indexOf('=') + 1).trim().replace("\"", "");
            }
        }
        return null;
    }
}

request.getPat 메서드를 이용해서 file값을 가져온다. ( parameter로는 접근 할 수 없음)

 

자바에서는 파일 쓰기 시에 먼저 임시 디렉터리에 파일을 저장한다. 기본 임시 디렉터리는 자바의 시스템 프로퍼티로 java.io.tmpdir로 지정되어 있고 실제 저장 위치는 System.getProperty("java.io.tmpdir"); 로 확인 할수 있다.
Get 데이터를 쿼리스트링 형식으로 전송
Post Application/x-www-formurlencoded : 데이터를 스트림 형태로 인코딩하여 전달할때 사용되는 전송방식

Multipart/form-data: 파일 업로드시 사용되는 전송 방식
파일 전송용 폼을 만들 때는 enctype="multipart/form-data" 추가
반응형