Programming > Java

ServletFileUpload 를 이용한 HttpServlet만들기 (MultiPart file upload with parameter)

ServletFileUpload 를 이용한 HttpServlet만들기

※ MultiPart upload 시 파일객체 및 파라메터 취득방법

의존 라이브러리를 참조한다.

<dependencies>
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.8.0</version>
    </dependency>
</dependencies>

DiskFileItem사용시 임시파일을 확실하게 삭제하기 위한처리로 web.xml에 다음 추가

 <listener>
   <listener-class>
     org.apache.commons.fileupload.servlet.FileCleanerCleanup
   </listener-class>
 </listener>

TEST를 위한 서블릿 (기타 용도에 맞게 사용)

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * @author emunhi
 *
 */
@WebServlet("/fileupload")
public class FileUpload extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @SuppressWarnings("rawtypes")
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        /*
         * 요청응답 설정 (여기서는 HTML형식 반환)
         */
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<style>table{border:1px solid black;border-collapse:collapse;}th,td{border:1px solid black;}</style>");
        out.println("<HTML><HEAD><TITLE>업로드테스트(MultiPart)</TITLE></HEAD><BODY>");

        // (1) 파일업로드 요청인지 확인한다.
        if (ServletFileUpload.isMultipartContent(request)) {
            try {
    
                // 디스크상의 파일관리할 위치 설정
                String uploadPath = "D:/logs/xxx";// this.getServletContext().getRealPath("/");
    
                /*
                 * (2) 설정주의 -
                 *  관련해서는 아래 사이트를 참조할 것 
                 *  http://commons.apache.org/proper/commons-fileupload/using.html 
                 */
                // Create a factory for disk-based file items
                DiskFileItemFactory diskFactory = new DiskFileItemFactory();
                // DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize, yourTempDirectory); // 한번에 구성시
    
                // Configure a repository (to ensure a secure temp location is used)
                diskFactory.setSizeThreshold(1024 * 1024 * 1024); // Your Max Memory Size
                diskFactory.setRepository(new File(uploadPath + "/temp"));
    
                // Create a new file upload handler
                ServletFileUpload upload = new ServletFileUpload(diskFactory);
    
                // Set overall request size constraint :: 파라메터 (long)를 안넣으면 0
                upload.setSizeMax((long) 1024 * 1024 * 1024 * 1024 * 2); // 2TB : Your Max Request Size
    
                // Parse the request​​
                List<FileItem> items = upload.parseRequest(request);
    
                // Process the uploaded items
                Iterator iter = items.iterator();
                while (iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();
                    if (item.isFormField()) { // 파일 이외
                        processFormField(out, item);
                    } else { // 파일인 경우
                        processUploadFile(out, item, uploadPath);
                    }
                }
            } catch (Exception e) {
                out.println("<PRE>");
                e.printStackTrace(out);
                out.println("</PRE>");
            }
        } else {
            out.println("<H4 style='color:red;font-weight:bold'>MultiPart형식이 아님!!</H4>");
        }
        out.println("</BODY></HTML>");
    }

    // 업로드한 정보가 파일인경우 처리
    private void processUploadFile(PrintWriter out, FileItem item, String uploadPath) throws Exception {
        String name = item.getFieldName();     // 파라메터명(key)을 취득한다.
        String fileName = item.getName();     // 파일명
        String contentType = item.getContentType();// 컨텐츠타입
        //boolean isInMemory = item.isInMemory();
        long fileSize = item.getSize(); // 파일크기

        // 저장할 파일명은 현재시각으로 변환해서 저장한다.
        String fileExt = fileName.substring(fileName.lastIndexOf("."));
        String uploadedFileName = System.currentTimeMillis() + fileExt;

        // 저장할 파일객체를 생성한다.
        File uploadedFile = new File(uploadPath + "/upload/" + uploadedFileName);
        item.write(uploadedFile); // 파일 저장

        // 결과를 화면에 보여줌
        out.println("<table style='margin-bottom:10px;'>");
        out.println("<tr><td style='width:150px;'>파라미터명</td><td style='width:450px;'>"+name+"</td></tr>");
        out.println("<tr><td style='width:150px;'>파일명</td><td style='width:450px;'>"+fileName+"</td></tr>");
        out.println("<tr><td style='width:150px;'>컨텐츠타입</td><td style='width:450px;'>"+contentType+"</td></tr>");
        out.println("<tr><td style='width:150px;'>파일사이즈</td><td style='width:450px;'>"+fileSize+"</td></tr>");
        out.println("<tr><td style='width:150px;'>업로드파일</td><td style='width:450px;'>"+uploadedFile.getPath()+"</td></tr>");
        out.println("</table>"); 
    }

    private void processFormField(PrintWriter out, FileItem item) throws Exception {
        String name = item.getFieldName();         // 파라메터명(key) 을 취득한다.
        String value = item.getString("UTF-8"); // UTF-8형식으로 값을 읽는다.
        
        // 결과를 화면에 보여줌
        out.println("<table style='margin-bottom:10px;'>");
        out.println("<tr><td style='width:150px;'>"+name+"</td><td style='width:250px;'>"+value+"</td></tr>");
        out.println("</table>"); 
    }
}

 

상세한 내역을 참조할려면 아래 사이트 이용

http://commons.apache.org/proper/commons-fileupload/using.html