반응형
첨부파일 다운로드
UploadController.java
@GetMapping(value = "/download",
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ResponseBody
public ResponseEntity<Resource> downloadFile(String fileName) {
Resource resource = new FileSystemResource("D:\\upload\\" + fileName);
String resourceName = resource.getFilename();
HttpHeaders headers = new HttpHeaders();
try {
headers.add("Content-Disposition",
"attachment; filename=" + new String(resourceName.getBytes("UTF-8"), "ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new ResponseEntity<Resource>(resource, headers, HttpStatus.OK);
}
- /download?fileName=XXX'와 같이 호출 시 파일 다운로드 한다.
- MIME 타입은 다운로드 할 수 있는 'application/octet-stream'으로 지정한다.
- 다운로드시 저장되는 이름은 'Content-Disposition'을 이용해서 지정한다.
파일 이름에 한글인 경우 저장할 때 깨지는 문제를 막을 수 있다. - ResponseEntity<Resource>
- ResponseEntity<> 타입은 byte[] 등을 사용할 수 있지만, Resource를 이용해 좀 더 간단히 처리가 가능하다.
UploadAjax.jsp
function showUploadedFile(uploadResultArr) {
var str = "";
$(uploadResultArr).each(function(i, obj){
if(!obj.image){
var fileCallPath = encodeURIComponent( obj.uploadPath+"/"+ obj.uuid +"_"+obj.fileName);
str += "<li><a href='/download?fileName="+fileCallPath+"'>"
+"<img src='/resources/img/attach.png'>"+obj.fileName+"</a></li>"
}else{
var fileCallPath = encodeURIComponent( obj.uploadPath+ "/s_"+obj.uuid +"_"+obj.fileName);
str += "<li><img src='/display?fileName="+fileCallPath+"'><li>";
}
});
uploadResult.append(str);
}
- 이미지 파일인 경우 이미지가 보이도록 / 일반 파일인 경우 attach.png 파일이 보이게 설정
- 이미지를 클릭하였을 때 첨부 파일이 다운받아지도록 설정
하지만 문제 두 가지!!
- 아직 까지 fileCallPath는 UUID가 붙은 파일이름으로 순수한 파일이름이 아니기 때문에 이를 처리하는 작업이 필요하다.
- 크롬이 아니라 IE(인터넷 익스플로어), Edge에서는 한글 파일이 제대로 다운받아지지 않는 문제가 있다.
UploadController.java
@GetMapping(value = "/download",
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ResponseBody
public ResponseEntity<Resource> downloadFile(@RequestHeader("User-Agent") String userAgent, String fileName) {
Resource resource = new FileSystemResource("D:\\upload\\" + fileName);
if (resource.exists() == false) {
return new ResponseEntity<Resource>(HttpStatus.NOT_FOUND);
}
String resourceName = resource.getFilename();
// remove UUID
String resourceOriginalName = resourceName.substring(resourceName.indexOf("_") + 1);
HttpHeaders headers = new HttpHeaders();
try {
String downloadName = null;
// IE(Internet Explorer
if (userAgent.contains("Trident")) {
downloadName = URLEncoder.encode(resourceOriginalName, "UTF-8").replaceAll("\\+", " ");
}
// Edge
else if (userAgent.contains("Edge")) {
downloadName = URLEncoder.encode(resourceOriginalName, "UTF-8");
}
else {
downloadName = new String(resourceOriginalName.getBytes("UTF-8"), "ISO-8859-1");
}
headers.add("Content-Disposition", "attachment; filename=" + downloadName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new ResponseEntity<Resource>(resource, headers, HttpStatus.OK);
}
반응형
'ETC' 카테고리의 다른 글
[springMVC + Ajax] 게시판 첨부파일 추가 (0) | 2022.09.27 |
---|---|
Spring + Ajax 파일 다운로드 시 Internet Explorer, Edge에서 한글이름 깨짐 (0) | 2022.09.26 |
Spring + Ajax 섬네일 파일 생성, 이미지 파일인지 구분, 이미지 클릭 시 원본 이미지 출력 (0) | 2022.09.25 |
Spring + Ajax 중복된 파일 이름 해결 (0) | 2022.09.25 |
Spring + Ajax 파일 확장자, 크기 제한 (Ajax) (0) | 2022.09.25 |