FileSystemResource를 사용하여 파일을 강제로 다운로드할 때 'Content-Disposition' 및 'Filename'을 설정하는 방법은 무엇입니까?
다음을 설정하는 가장 적절하고 표준적인 방법은 무엇입니까?Content-Disposition=attachment
그리고.filename=xyz.zip
스프링 3 사용FileSystemResource
?
이 작업은 다음과 같습니다.
@ResponseBody
@RequestMapping(value = "/action/{abcd}/{efgh}", method = RequestMethod.GET, produces = "application/zip")
@PreAuthorize("@authorizationService.authorizeMethod()")
public FileSystemResource doAction(@PathVariable String abcd, @PathVariable String efgh) {
File zipFile = service.getFile(abcd, efgh);
return new FileSystemResource(zipFile);
}
파일이 zip 파일이기 때문에 브라우저가 항상 파일을 다운로드하지만, 첨부 파일로 명시적으로 언급하고 파일의 실제 이름과 관련이 없는 파일 이름도 제공하고 싶습니다.
이 문제에 대한 해결책이 있을 수 있지만, 저는 적절한 Spring을 알고 싶습니다.FileSystemResource
이 목표를 달성하는 방법.
추신: 여기서 사용되는 파일은 JVM이 존재할 때 삭제 표시된 임시 파일입니다.
수락된 답변 외에도 Spring에는 이 목적에 맞는 ContentDisposition 클래스가 있습니다.나는 그것이 파일 이름 검사를 다룬다고 생각합니다.
ContentDisposition contentDisposition = ContentDisposition.builder("inline")
.filename("Filename")
.build();
HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(contentDisposition);
@RequestMapping(value = "/action/{abcd}/{efgh}", method = RequestMethod.GET)
@PreAuthorize("@authorizationService.authorizeMethod(#id)")
public HttpEntity<byte[]> doAction(@PathVariable ObjectType obj, @PathVariable Date date, HttpServletResponse response) throws IOException {
ZipFileType zipFile = service.getFile(obj1.getId(), date);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
response.setHeader("Content-Disposition", "attachment; filename=" + zipFile.getFileName());
return new HttpEntity<byte[]>(zipFile.getByteArray(), headers);
}
@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(@PathVariable("file_name") String fileName,HttpServletResponse response) {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=somefile.pdf");
return new FileSystemResource(new File("file full path"));
}
여기 봄 4에 대한 대안적인 접근법이 있습니다.이 예에서는 파일 시스템 액세스와 관련된 모범 사례를 사용하지 않습니다. 이는 일부 속성을 선언적으로 설정하는 방법을 보여주기 위한 것입니다.
@RequestMapping(value = "/{resourceIdentifier}", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
// @ResponseBody // Needed for @Controller but not for @RestController.
public ResponseEntity<InputStreamResource> download(@PathVariable(name = "resourceIdentifier") final String filename) throws Exception
{
final String resourceName = filename + ".dat";
final File iFile = new File("/some/folder", resourceName);
final long resourceLength = iFile.length();
final long lastModified = iFile.lastModified();
final InputStream resource = new FileInputStream(iFile);
return ResponseEntity.ok()
.header("Content-Disposition", "attachment; filename=" + resourceName)
.contentLength(resourceLength)
.lastModified(lastModified)
.contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE)
.body(resource);
}
주어진 답변 모두에 대해 약간의 변경을 가했고, 결국 데이터베이스에서 이미지를 블롭으로 추출한 다음 고객에게 제공해야 하는 프로젝트에서 두 가지 모두의 이점을 얻을 수 있었습니다.
@GetMapping("/images/{imageId:.+}")
@ResponseBody
public ResponseEntity<FileSystemResource> serveFile(@PathVariable @Valid String imageId,HttpServletResponse response)
{
ImageEntity singleImageInfo=db.storage.StorageService.getImage(imageId);
if(singleImageInfo==null)
{
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}
Blob image=singleImageInfo.getImage();
try {
String filename= UsersExtra.GenerateSession()+"xxyy"+singleImageInfo.getImage1Ext().trim();
byte [] array = image.getBytes( 1, ( int ) image.length() );
File file = File.createTempFile(UsersExtra.GenerateSession()+"xxyy", singleImageInfo.getImage1Ext().trim(), new File("."));
FileOutputStream out = new FileOutputStream( file );
out.write( array );
out.close();
FileSystemResource testing=new FileSystemResource(file);
String mimeType = "image/"+singleImageInfo.getImage1Ext().trim().toLowerCase().replace(".", "");
response.setContentType(mimeType);
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", filename);
response.setHeader(headerKey, headerValue);
// return new FileSystemResource(file);
return ResponseEntity.status(HttpStatus.OK).body( new FileSystemResource(file));
}catch(Exception e)
{
System.out.println(e.getMessage());
}
return null;
}
Kumar의 코드에서 Response Entity를 사용하면 올바른 Response 코드로 응답하는 데 도움이 됩니다.참고: Blob에서 파일로 변환하는 것은 다음 링크에서 인용됩니다: Java에서 Blob의 내용으로 파일을 만드는 스니펫.
언급URL : https://stackoverflow.com/questions/16601428/how-to-set-content-disposition-and-filename-when-using-filesystemresource-to
'programing' 카테고리의 다른 글
하위 항목의 -include와 -filter 간의 차이 (0) | 2023.08.10 |
---|---|
https://xxx.visualstudio.com/DefaultCollection/_git/project 에 대한 인증 실패 (0) | 2023.08.10 |
json 열로 테이블 결합 (0) | 2023.08.10 |
{} + {}이(가) 클라이언트 측에만 NaN이 있는 이유는 무엇입니까?왜 Node.js에 없습니까? (0) | 2023.08.10 |
호스트에서 VirtualBox의 Oracle DB에 액세스하는 방법(창) (0) | 2023.08.10 |