2017-11-22 2 views
0

私は、ユーザーがプロジェクトがホストされているサーバーに格納されているファイルをダウンロードできるSpring Webアプリケーションでビューを持っています。 このビューでは、情報がテーブルに表示されているファイルのリストを参照し、最後の列にはファイルをダウンロードするためのリンクが含まれています。 少数のファイルでHttpServletResponseのコンテンツタイプとヘッダがヌル値で送信され、コントローラ内の関数に設定されていても、ブラウザはapplication/octet-streamタイプの応答を表示します。Springファイルdownolad - httpServeletResponse nullヘッダーとコンテンツタイプ

私のJSPページで

<a href="<spring:url value='/download/${file.fileid}'/>"><i class="fa fa-download" title="download"></i></a> 

をそして、これはクラスのコントローラでdownolad関数のコードです:

@RequestMapping(value="/download/{fileid}", method = RequestMethod.GET) 
    public void download(@PathVariable Integer fileid, HttpServletResponse response) 
    { 

     File file = new File((directoryService.findBydata("feedback").getPath()).trim()+"\\"+ (fileservice.findByfileid(fileid).getfilename()).trim()); 
     InputStream fis;  
     if(file.exists()){ 
      try { 
        fis = new FileInputStream(file); 
        org.apache.commons.io.IOUtils.copy(fis, response.getOutputStream()); 
           response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

        response.setHeader("Content-Disposition", 
        "attachment; filename="+(fileservice.findByfileid(fileid).getfilename()).trim()); 

        response.flushBuffer(); 

        } catch (IOException e) { 
           e.printStackTrace(); 
          } 

         } 

}私がの原因を見つけることができません

この問題、なぜこれが起こるか?ありがとう。

+0

条件に障害が発生し、それが返事をおThak httpServeletResponse空ヘッダとコンテンツタイプ –

+0

を返した場合、ファイルは、あなたのソースコード、サーバー側で存在していない場合ので、あなたがエンティティのオプションのファイルのアップロードなどの機能を持っていますか、ファイルは、私のアプリケーションによって生成され、apache POIを使用しています。処理が正常に終了したら、ファイルレコードをDBに保存します。 100%確実になるために、私はサーバーをチェックインし、ファイルはそこにあります。 – Asma

答えて

0

HttpServletResponseへの変更は、メソッドが終了した後にのみ応答に書き込まれます。

しかし、あなたのコードはすぐにファイルの内容を出力ストリームに書き込みます。したがって、クライアントは、最初に適切なヘッダーなしでデータを受信します。

入力ストリームをInputStreamResourceにラップして返してください。

@RequestMapping(value="/download/{fileid}", method = RequestMethod.GET) 
public ResponseEntity<InputStreamResource> download(@PathVariable Integer fileid, HttpServletResponse response) { 
    File file = new File((directoryService.findBydata("feedback").getPath()).trim()+"\\"+ (fileservice.findByfileid(fileid).getfilename()).trim()); 
    if(file.exists()){ 
     try { 
      InputStream fis = new FileInputStream(file); 
      InputStreamResource inputStreamResource = new InputStreamResource(fis); 

      return ResponseEntity 
        .status(HttpStatus.OK) 
        .header(HttpHeaders.CONTENT_TYPE, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+(fileservice.findByfileid(fileid).getfilename()).trim()) 
        .body(inputStreamResource); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

素早い回答のために@Gorazdありがとうございました。したがって、一部のファイルでは、クライアントはコンテンツタイプとヘッダーが設定される前に応答を受け取ります。右?私はあなたのコードを試して、それは完璧に動作しています。とても感謝しています! – Asma

+0

はい。名前が示すように、ヘッダーはHTTP応答の冒頭にあります。 –

関連する問題