본문 바로가기
728x90
반응형
@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
반응형

한걸음 한걸음

개인적인 기록