반응형
Spring Boot Rest 서비스에서 파일 다운로드
Spring boot rest 서비스에서 파일을 다운로드하려고합니다.
@RequestMapping(path="/downloadFile",method=RequestMethod.GET)
@Consumes(MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<InputStreamReader> downloadDocument(
String acquistionId,
String fileType,
Integer expressVfId) throws IOException {
File file2Upload = new File("C:\\Users\\admin\\Desktop\\bkp\\1.rtf");
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
InputStreamReader i = new InputStreamReader(new FileInputStream(file2Upload));
System.out.println("The length of the file is : "+file2Upload.length());
return ResponseEntity.ok().headers(headers).contentLength(file2Upload.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(i);
}
브라우저에서 파일을 다운로드하려고하면 다운로드가 시작되지만 항상 실패합니다. 다운로드 실패를 유발하는 서비스에 문제가 있습니까?
InputStreamResource를 사용하는 옵션 1
주어진 InputStream에 대한 리소스 구현 .
다른 특정 리소스 구현이 적용되지 않는 경우에만 사용해야합니다. 특히 가능한 경우 ByteArrayResource 또는 파일 기반 리소스 구현을 선호합니다.
@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String param) throws IOException {
// ...
InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
return ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(resource);
}
InputStreamResource의 문서가 제안하는 Option2 - ByteArrayResource 사용 :
@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String param) throws IOException {
// ...
Path path = Paths.get(file.getAbsolutePath());
ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));
return ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(resource);
}
아래 샘플 코드는 나를 위해 일했으며 누군가를 도울 수 있습니다.
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
@RequestMapping("/app")
public class ImageResource {
private static final String EXTENSION = ".jpg";
private static final String SERVER_LOCATION = "/server/images";
@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(@RequestParam("image") String image) throws IOException {
File file = new File(SERVER_LOCATION + File.separator + image + EXTENSION);
HttpHeaders header = new HttpHeaders();
header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=img.jpg");
header.add("Cache-Control", "no-cache, no-store, must-revalidate");
header.add("Pragma", "no-cache");
header.add("Expires", "0");
Path path = Paths.get(file.getAbsolutePath());
ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));
return ResponseEntity.ok()
.headers(header)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(resource);
}
}
ReferenceURL : https://stackoverflow.com/questions/35680932/download-a-file-from-spring-boot-rest-service
반응형
'programing' 카테고리의 다른 글
PACKETS와 FRAMES의 차이점 (0) | 2021.01.13 |
---|---|
angular2 라우터에서 페이지 제목을 변경하는 방법 (0) | 2021.01.13 |
Typescript가 이름 창 또는 문서를 찾을 수 없습니다. (0) | 2021.01.13 |
Nginx 프록시 Amazon S3 리소스 (0) | 2021.01.13 |
-awakeFromNib 또는 -viewDidLoad를 사용해야합니까? (0) | 2021.01.13 |