Preloader image
DDD

자바

Swagger에서 파일 다운로드 API 구현

작성자 관리자 (admin)
조회수 54
입력일 2025-03-28 04:17:06

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;

@RestController
@RequestMapping("/api/files")

public class FileDownloadController {

    @Operation(summary = "파일 다운로드", description = "서버에서 지정된 파일을 다운로드합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "파일 다운로드 성공"),
        @ApiResponse(responseCode = "404", description = "파일을 찾을 수 없음")
    })

    @GetMapping("/download")
    public void downloadFile(@RequestParam String fileName, HttpServletResponse response) throws IOException {
        // 파일 경로 설정 ( 예: 프로젝트 내 저장 폴더 - /tmp/abc.jpg )
        Path filePath = Paths.get("files", fileName);
        Resource resource = new PathResource(filePath.toAbsolutePath().toString());

        if (!resource.exists()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "파일을 찾을 수 없습니다.");
            return;
        }

        // 응답 헤더 설정 (Swagger에서 파일 다운로드 가능하도록)
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        response.setHeader("Content-Type", "application/octet-stream");

        // 파일을 스트림을 통해 클라이언트로 전송
        try (InputStream inputStream = resource.getInputStream();
             OutputStream outputStream = response.getOutputStream()) {
            inputStream.transferTo(outputStream); // Java 9+
        }
    }
}