2016-02-28 3 views
9

Я пытаюсь загрузить файл из службы загрузки Spring.скачать файл из службы загрузки Spring загрузки

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

Когда я попытался загрузить файл из браузера, он начнет загрузку, но всегда терпит неудачу. Есть ли что-то неправильное в службе, которая приводит к сбою загрузки?

ответ

27

Вариант 1 с помощью реализации InputStreamResource

Resource для данного 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); 
} 

Option2 как документации InputStreamResource предлагает - с помощью 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); 
} 
+2

Option2 решить эту проблему. – kiran

+0

Я пытаюсь сделать это для формата документа .doc, но при загрузке формат пропадает, и файл загружается без расширения файла, а имя файла - ответ при загрузке. Любое предложение? –

+3

@TulsiJain add Content-Disposition HttpHeader: 'HttpHeaders headers = new HttpHeaders(); headers.add (HttpHeaders.CONTENT_DISPOSITION, "attachment; filename = myDoc.docx"); ' – fateddy

Смежные вопросы