2013-05-17 2 views
10

Что является наиболее подходящим и стандартным способом установки Content-Disposition=attachment и filename=xyz.zip с использованием пружины 3 FileSystemResource?Как установить «Content-Disposition» и «Filename» при использовании 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); 
} 

Хотя файл почтовый файл, чтобы браузер всегда загружает файл, но я хотел бы явно указать файл как вложение, а также предоставить имя файла, которое имеет не имеет никакого отношения к фактическому имени файла.

Возможно, у вас возникнут обходные пути для этой проблемы, но я хотел бы знать правильный вес и FileSystemResource способ достижения этой цели.

P.S. Файл, который используется здесь, является временным файлом, помеченным для удаления, когда существует JVM.

ответ

12
@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); 
} 
+1

Но обратите внимание, что это нарушит, если имя файла содержит не «маркеров» символы, такие как пробелы, не-ASCII, и некоторые разделители. –

+2

short answer 'response.setHeader (« Content-Disposition »,« attachment; filename = »+ YOUR_FILE_NAME);' –

+0

Избегайте ответов только на код. Предоставьте некоторые пояснения к фрагменту! – Manu343726

7
@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")); 
    } 
+0

Что именно возвращает этот метод? Что такое myService? – user3809938

+0

@ user3809938 конструктор для FileSystemResource может принимать 'File' или' String' для пути – Phas1c

1

Вот альтернативный подход к Весеннему 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); 
} 
Смежные вопросы