반응형
@RequestMapping("/Download")
public class DownloadController {
private static String UPLOAD_FOLDER = "D:/logs/";
@Autowired FileService fileService;
@GetMapping("/{fileId}")
public ResponseEntity<Resource> downloadFile(@PathVariable("fileId") int fileId) throws MalformedURLException, UnsupportedEncodingException {
FileInfo fileInfo = fileService.selectFileInfo(fileId);
if(fileInfo == null){
return ResponseEntity.notFound().build();
}
Path path = Paths.get(fileInfo.getFilePath(), fileInfo.getStoredFilename());
Resource resource = new UrlResource(path.toUri());
if(!resource.exists()){
return ResponseEntity.notFound().build();
}
// 파일명을 UTF-8로 인코딩
String encodedFileName = URLEncoder.encode(fileInfo.getOriginalFilename(), StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20");
String contentDisposition = "attachment; filename*=UTF-8''" + encodedFileName;
//응답헤더에 CONTETN_DISPOSITION -> 첨부파일이라고 알려줌, attachment; 다음나오는것 다운로드, .body(resource)->resource 에 파일내용 담아감
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
.body(resource);
}
}
파일 다운로드시 사용하는 내 download 컨트롤러 이다.
마지막부분에서
// 파일명을 UTF-8로 인코딩
String encodedFileName = URLEncoder.encode(fileInfo.getOriginalFilename(), StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20");
String contentDisposition = "attachment; filename*=UTF-8''" + encodedFileName;
encodedFileName 을 통해 UTF-8 인코딩을하고, URL 인코더는 공백문자를 '+' 로 인코딩하므로 %20으로 알맞게 변환해준다. 그 이후 UTF-8 인코딩 되었음을 명시하여 파일깨지지 않게 만들어줌.
728x90
반응형
'IT 공부 > Java' 카테고리의 다른 글
[Java] JFR (Java Flight Recorder) (0) | 2024.12.11 |
---|---|
[Java] 파일 업로드 Multipart 시 413 에러 (0) | 2024.06.28 |
[JavaScript] 자바스크립트로 달력, 시계(디지털) 구현하기 (팝업 구현) (0) | 2024.06.21 |
[JavaScript] 카테고리 이동 JavaScript 로 구현해보기 (LocalStorage) (0) | 2024.06.18 |
[JavaScript] 메뉴 카테고리 JavaScript 로 구현하기 (LocalStorage) (0) | 2024.06.14 |