[[ 파일 업로드 ]]
=> Multipart 이용
[ Multipart 개념 ]
< HTTP 요청 양식 >
1. 도입부 내용 :
(1) uri?파라미터 내용(get요청 일 때)
(2) Method 방식 ( get / post )
(3) http 버전
이용가치 : request.getMethod( ) / request.getRequestURI( )
2. Header 내용 :
(1) 브라우저이름
(2) 요청 ip
이용가치 : req.getHeader(" 요청정보 ") / req.getRemoteAddr( )
3. Body 내용 :
(1) post요청일때 파라미터 내용
이용가치 : req.getParameter( ) / MultipartFile
- 도입부에는 길이에 제한이 있다.
즉, get방식으로 요청할 수 있는 파라미터는 길이 제한됨
- http 요청 body 부에는 길이 제한이 없다.
=> 파일업로드 요청은 body 부로 요청내용을 나눠 보내서 처리하는 방식 : Multipart
[ Multipart 방식 ]
- Http 프로토콜 요청에서 Body 부분에 데이터를 나눠서 전송하는 방식
- 파일업로드=> http 요청 body 부 => post 방식으로 나눠서 전송
- HttpServletRequest 객체는 파일업로드 지원 메소드 없다.
=> 파일업로드 전용 라이브러리들 설치필요 ( Http요청 Body부에서 파일정보 가져오는 입력Stream )
[[ 업로드 순서 ]]
1. [ 라이브러리 설치 ] (pom.xml)
Apache Commons IO .jar
Apache Commons FileUpload .jar
2. [ MultipartResolver 객체등록 ]
(servlet-context.xml)
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
- MultipartResolver : 파일업로드로 들어온 요청을 인식하게 해주는 객체
( input 에서 type = "file" 로 들어오면 인식(Resolve) => MultipartFile 타입으로 받을 수 있게 해줌 )
(Boot환경에서는 자동)
3. [ 클라이언트단 설정 ]
<form action="URL" method="post" enctype="multipart/form-data" >
업로드파일1 : <input type="file" name="file1" multiple="multiple"> <br>
업로드파일2 : <input type="file" name="file2"> <br>
<input type="submit" value="파일업로드">
</form>
- post방식 필수
- enc 타입 multipart 설정 필수
: 폼 데이터(form data)가 서버로 제출될 때 => 해당 데이터가 encoding되는 방법 : multipart
( multipart 방식 설정 => req.getParameter 사용불가 )
- type="file"
- multiple 속성 => 파일첨부 여러개 동시에 가능
( => 받을 때, Multipart 객체 배열로 받아서 사용 )
4. [ 서버단 설정 ]
(1) 파일, 정보등 URL로 보내는게 많으면, UploadDTO 만들어서 사용
public class UploadDTO {
String name; 보낸사람
String description; 파일 설명
MultipartFile file1; 보낸 파일
MultipartFile file2; 보낸 파일
생성자 / 게터세터
- input type="file" 로 들어온 객체는 MultipartFile 타입으로 받을 수 있다. ( MultipartResolver 덕에 )
(2) 파일을 서버에 (복사)Transfer
@PostMapping("/fileupload")
public String uploadprocess(UploadDTO dto, Model model) throws IOException {
String savePath = "c:/upload/";
MultipartFile mf1 = dto.getFile1();
if( ! mf1.isEmpty( )){
String originalname1 = mf1.getOriginalFilename();
String onlyfilename = originalname1.substring(0, originalname1.indexOf("."));
String extname = originalname1.substring(originalname1.indexOf("."));
String newname = onlyfilename + "(" + UUID.randomUUID( ).toString( ) +")" + extname;
File serverfile1 = new File(savePath + newname);
mf1.transferTo (serverfile1);
model.addAttribute("dto", dto);
return "upload/uploadprocess";
}
- @PostMapping 으로만 받을 수 있다.
- IOException 처리 필수
- 저장경로 정해두기 ( 폴더 없을 시 자동생성 )
- File 객체 MultipartFile 타입으로 받기
- getOriginalFilename( ) 메소드로 업로드한 파일명 그대로 가져오기
- substring( ) 으로 파일명 / 확장자 따로 받아두고, 사이에 UUID 난수 넣어서 중복방지
- java.io.File 클래스 사용해서 빈파일 생성 ("c:/upload/newname"); => 경로 + 파일명
- (업로드된 MultipartFile 객체) transferTo (만들어둔 빈파일) [복사]
=> 지정해둔 경로로, 해당 파일명으로 복사해서 생성!
[ getOriginalFilename( ) / getSize( ) ]
- 파일업로드 시, 해당 파일 객체는 기본적으로 파일명, 파일길이, 파일내용 등의 정보를 가짐
( 메소드로 뽑아서 사용가능 )
.getOriginalFilename() : 업로드한 파일명 그대로
.getSize() : 업로드한 파일 크기 ( byte )
( 파일경로 정보는 보안상 이유로 막아두는걸로 바뀌어 왔다. )
[ 중복이름 방지 ]
- 같은 이름의 파일을 업로드하면, 나중에 보낸 파일을 덮어쓰면서 업로드 한다.
=> 파일이름을 중복되지 않도록, 저장할 때, 원래 파일이름에 난수 붙여주기
=> java.util.UUID 사용
[ 파일첨부 여러개 ]
- input 에서 multiple 속성을 걸어주면 여러개 동시에 업로드 할 수 있다.
( client 입장에서 shift 키로 여러파일 업로드하는게 익숙하지 않을 수 있으므로,
한개 씩 따로 업로드 하는 방식을 제공하는 것 도 가치가 있는 듯 하다. )
- 하나 씩 파일첨부를 여러개 걸어둘 경우, 입력값을 주지 않을시 오류
=> isEmpty( ) 메소드 사용 조건문 처리
'Back to the Spring' 카테고리의 다른 글
[AJAX] 동적태그에 AJAX 적용하기 (0) | 2022.08.26 |
---|---|
[ AJAX ] REST API / JSON / ResponseBody (0) | 2022.08.25 |
@Mapping 사용법 ( @RequestParam / @ModelAttribute / @PathVariable ) (0) | 2022.08.18 |
DispatcherServlet // HandlerMapping // ViewResolver (0) | 2022.08.18 |
[DI] xml 방식 / Componenet - Scan 방식 (0) | 2022.08.18 |