개발 기록이

[JAVA] 파일 다운로드 url 생성하기 본문

웹 개발/Back-end

[JAVA] 파일 다운로드 url 생성하기

studyingbackhoe 2024. 5. 25. 15:31

프로젝트 내에 있는 특정 파일을 다운로드하는 url을 만들어보려고 한다.

(다운로드할 파일의 경로 : http://localhost:8080/resources/file/sample.pdf)

@RequestMapping("/downloadFile.do")
public void downloadFile(HttpServletResponse response) {
        
    String fileUrl = "http://localhost:8080/resources/file/sample.pdf";

    try {

     	Path tempFilePath = Files.createTempFile("sample", ".pdf");

        URL url = new URL(fileUrl);
        Files.copy(url.openStream(), tempFilePath, StandardCopyOption.REPLACE_EXISTING);

        // 응답 헤더 설정
        String originalFileName = "sample.pdf";
        String encodedFileName = URLEncoder.encode(originalFileName, StandardCharsets.UTF_8.toString());
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");

        // 파일을 읽어서 응답으로 전송
        try (InputStream inputStream = Files.newInputStream(tempFilePath);
             OutputStream outputStream = response.getOutputStream()) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

	// 파일 다운로드한 후 저장된 임시 파일 삭제
        Files.deleteIfExists(tempFilePath);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

 

1.  fileUrl에 있는 파일이름과 동일하게 sample.pdf 임시파일 경로 생성  

Path tempFilePath = Files.createTempFile("sample", ".pdf");

 

2. fileUrl  주소에 있는 파일에 접근할 수 있도록 URL 객체를 생성

URL url = new URL(fileUrl);

* URL(Uniform Resource Locator) : 웹 서버, 파일 서버 등에서 파일이나 데이터를 가져오는 데 필요한 기능을 제공하는 클래스

 

3. 지정된 주소(fileUrl)에 있는 파일을 읽어와서 임시 폴더에 임시 파일(tempFile)로 저장

Files.copy(url.openStream(), tempFilePath, StandardCopyOption.REPLACE_EXISTING);

 

4. HTTP 응답 헤더에 encodedFileName  이름으로 첨부 파일 다운로드 지정

response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
// Content-Disposition: attachment; filename="sample.pdf"

 

5. 파일 데이터를 읽어서 HTTP 응답으로 전송

try (InputStream inputStream = Files.newInputStream(tempFilePath);
     OutputStream outputStream = response.getOutputStream()) {

    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }

} catch (IOException e) {
    e.printStackTrace();
}

 

6. 파일 다운로드 완료 후 임시파일 삭제

Files.deleteIfExists(tempFilePath);

 

7. http://localhost:8080/downloadFile.do 이동 시 sample.pdf 파일이 다운로드됨

 

 

자바 아이콘 제작자: Alfredo Hernandez - Flaticon

출처 : OpenAI ChatGPT (https://openai.com)