1. form에서 파일전송을 위해 enctype="multipart/form-data 을 설정하여 인코딩하여 서버로 전송
-> 인코딩을 하지 않을 경우 파일명만 서버에 전송됨
2. 파일업로드를 위한 서블릿 설정
2-1. web.xml
-> 한번만 설정하면됨
<multipart-config>
<location>/tmp</location>
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request.size>
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
2-2. annotation
-> class마다 설정을 해줘야됨
@MultipartConfig(
location="/tmp", (용량 초과시 저장되는 디스크 경로 // 절대경로로 적어줘야하지만
절대경로는 서비스를 실행하는 리눅스와 윈도우즈에 차이가 있으므로
설정을 따로 안하고 자바가 지정해놓은 임시 렉토리를 사용)
fileSizeThreshold = 1024*1024, (1메가가 넘었을때 메모리가 아니라 디스크 경로에저장)
maxFileSize = 1024*1024*5, (개당 최대파일용량)
maxRequestSize = 1024*1024*5*5) (전체 최대파일용량)
3. 서버에서 파일 불러오기
// multi-part로 전송해서 part의 이름으로 바이너리 형식으로 value값을 가져옴
Part filePart = request.getPart("file");
// 바이너리value값에서 파일명을 가져옴
String fileName = filePart.getSubmittedFileName();
InputStream fis = filePart.getInputStream();
// 파일이 저장되는 실제 경로를 나타냄
String realPath = request.getServletContext().getRealPath("/upload");
System.out.println(realPath);
// read는 바이트씩 단위로 읽어드림 끝까지 다 읽었을경우 -1 반환
//int b = fis.read();
// File.spparator를 사용하는 이유 : 윈도우나 유닉스 os별로 파일구분하는 (ex: '\') 구분자가 달라 separator함수 사용
String filePath = realPath + File.separator + fileName;
FileOutputStream fos = new FileOutputStream(filePath);
// read()는 바이트 단위로 읽어드림 다 읽었을경우 -1 반환
// read()는 효율적이지 못해 오버로드 함수인 byte[]로 받는 함수를 사용
byte[] buf = new byte[1024];
int size = 0;
while((size = fis.read(buf)) != -1) {
//fos.write(buf) 는 1555 바이트를 예로 든다면 한번돌고 나머지 531바이트때 문제가 생김
//그래서 0~size만큼으로 사용
fos.write(buf, 0, size);
}
fos.close();
fis.close();
'study > Servlet&JSP' 카테고리의 다른 글
8. Transaction (0) | 2021.12.23 |
---|---|
6. 중간정리(흐름도) (0) | 2021.12.01 |
5. EL(Expression Language) (0) | 2021.11.24 |
4. JSP MVC model1, MVC model2 (0) | 2021.11.18 |
3_JSP 흐름 및 코드블럭 (0) | 2021.11.17 |