[JAVA] MultipartParser 파일 저장경로를 파라메터로 받아서 업로드하기

 

저장 경로를 미리 정해두지 않고 파라메터로 받아서 처리하고 싶을때 

MultipartParser를 사용한다.

 

1. 클라이언트 (html)

 - ajax에서 multipart/form-data 로 보낼 것이므로 form에는 굳이 써주지 않아도 된다.

<form method="post" action="">
    <input type="hiddn" id="savePath">
    <input type="file" id="fileUpload">
    <input type="submit" value="Upload">
</form>

2. 클라이언트 (ajax)

  - 주의할 점은 파일의 경로를 먼저 append해주고 그 후에 파일을 append해준다.

//파일업로드 리스트 생성
var fileData = new FormData();
var files = $("#fileUpload").get(0).files;
 
fileData.append("savePath", "EMPLOYEE");
 
if (files.length > 0) {
    for (var i = 0; i < files.length; i++) {
        fileData.append(files[i].name, files[i]);
    }
}
 
$.ajax({
        type: "POST",
        url: hostUrl + "api/File/Upload",
        contentType: false,
        processData: false,
        async: false,
        crossDomain: true,
        data: fileData,
        success: function (data) {
            result = JSON.parse(data);
        },
        error: function (request, status, error) {
            alert("code:" + request.status + "\n" + "error:" + error);
        }
});

 

3. 백엔드(java)

- 파일데이터를 while문을 돌면서 순차적으로 파라메터로 받는다. 앞서 파일객체를 생성할 때 경로를 먼저 넣으라고 한 이유가 여기에 있다. 순차적으로 돌기 때문에 경로를 먼저 받아야 그 경로로 파일을 보낼 수 있는 것이다.

package com.file;
 
import java.io.*;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.oreilly.servlet.multipart.*;
 
public class Upload extends HttpServlet {
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        process(req, resp);
        
    }
    //처리내용
    protected void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        
        // 30Mbyte 제한
        int maxSize  = 1024*1024*30;   
        String fsl = File.separator;
        String root = req.getSession().getServletContext().getRealPath(fsl);
        String rootPath = root + fsl + "Uploads";
        String savePath = "";
        
        MultipartParser mp = new MultipartParser(req, maxSize);
        mp.setEncoding("UTF-8");
 
        Part part;
        while ((part = mp.readNextPart()) != null) {
            String name = part.getName();
 
            //파일이 아닐때
            if (part.isParam()) {
                ParamPart paramPart = (ParamPart) part;
                String value = paramPart.getStringValue();
                //System.out.println("param; name=" + name + ", value=" + value);
                if (name.equals("savePath")) 
                    savePath = value;
                
            }
 
            // 파일일때
            else if (part.isFile()) {
                FilePart filePart = (FilePart) part;
                filePart.setRenamePolicy(new DefaultFileRenamePolicy()); //중복파일

                String fileName = filePart.getFileName();
                if (fileName != null) {
                    File dir = new File(rootPath + fsl + savePath);
                    if (!dir.isDirectory()){     //디렉토리인지 체크 후 없으면 생성
                        dir.mkdir();
                    }
                    //System.out.println(dir);
                    long size = filePart.writeTo(dir);
                }
                else {
                    //form type 이 file 이지만 비어있는 파라메터
                    System.out.println("file; name=" + name + "; EMPTY");
                }
            }
        }    
    }
    
}

개인적으로는 MultipartRequest로 보내는 것보다 이 방법이 더 좋은것 같다.

 

 

< MultipartRequest로 파일 업로드 하기 바로 가기 >

https://kwonyang.tistory.com/8

 

[JAVA] MultipartRequest File Upload

[JAVA] MultipartRequest File Upload 파일업로드를 하기 위해서는 oreilly.jar 를 먼저 다운받는다. 그리고 CLASSPATH 환경변수에 넣어둔다 (예: %CATALINA_HOME%\lib\oreilly.jar) 1. 클라이언트 단(Ajax) 제..

kwonyang.tistory.com

 

+ Recent posts