[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] hashMap key값으로 value 찾기 value로 key값 찾기 (0) | 2022.02.23 |
---|---|
[JAVA] unchecked or unsafe operations (0) | 2021.06.01 |
[JAVA] MultipartRequest File Upload (0) | 2021.06.01 |
서블릿에서 HTTP Request Body 읽기 (0) | 2021.05.20 |
MYSQL DATEDIFF, TIMEDIFF 로 날짜 시간 계산하기 (0) | 2021.05.20 |