클라이언트에서 업로드한 파일을 서블릿에서 경로를 지정해 저장하고자 한다.
우선 업로드한 파일을 서블릿에서 처리하려면 form 태그에 enctype 속성을 추가해야한다.
<form action="/test.do" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
</form>
form 태그를 통해 서블릿에 요청으로 넘어온 데이터들은 하나의 HTTP Request Body에 들어가는데
multipart를 설정하면 그 안에서 각 데이터의 종류를 구분할 수 있게 된다.
그 다음 요청을 받는 서블릿에 @MultipartConfig 어노테이션을 추가한다.
MultipartConfig 어노테이션에는 몇 가지 속성이 존재하며 생략할 수도 있다.
설정을 마친 뒤 서블릿에서 파일을 저장하는 구문을 작성하면 된다.
1. 파일 저장 경로 설정
File file = new File("D:/uploads");
if(!file.exists()) file.mkdirs();
2. 파일 가져오기 / 저장하기
for(Part p : request.getParts()){
String fileName = "";
fileName = extractFileName(p);
if(!fileName.equals("")){
FileVo fileVo = new FileVO();
// DB에 저장할 데이터를 VO 객체에 넣어준다.
// ...
try{
// Part 클래스의 write() 메서드를 사용해 파일을 원하는 경로에 저장할 수 있다.
p.write(file + File.separator + "파일명");
} catch (Exception e){
e.printStackTrace();
}
}
}
3. 파일 여부를 확인하고 파일명을 가져오는 메서드
public String extractFileName(Part p){
String fileName = "";
String header = part.getHeader("content-disposition");
String[] items = header.split(";");
for(String item : items){
// 파일명은 fileName이라는 헤더 속성에 들어있다.
// fileName 헤더 속성이 없다는 것은 해당 Part가 파일이 아니라는 뜻이다.
if(item.trim().startsWith("filename"){
// 'fileName=파일명.jpg' 형태에서 파일명만 추출한다.
fileName = item.substring(item.indexOf("=") + 2, item.length() - 1);
}
}
return fileName;
}
'웹 개발 > 웹 개발' 카테고리의 다른 글
checkbox에서 여러 개의 값 가져오기 (0) | 2022.12.30 |
---|---|
하나의 톰캣에서 여러 개의 서비스 구동하기 (0) | 2022.12.30 |
Input 태그 file 타입의 선택된 파일 정보 가져오기 (0) | 2022.12.29 |
SHA-256 암호화 하기 (0) | 2022.12.24 |
게시글 페이지 댓글 / 대댓글 구현 (0) | 2022.12.11 |