2017-08-25 12 views
2

hdfsからファイルを提供する簡単な残りのAPIを作成しました(ファイルが大きく、ローカルにコピーしたくありません)。Spring Rest APIを使用してファイルが完全にダウンロードされたかどうかを確認する方法

ファイルのダウンロードが正常に完了した、つまりストリーム全体が読み込まれたという情報をログに記録したいと思いますが、わかりません。ファイルのダウンロードが開始されたという情報のみを記録できます。

私は何か助けていただきありがとうございます。

@Autowired 
    private FileDownloadService fds; 

    @RequestMapping(value = GET_FILE_PATH, method = RequestMethod.GET) 
    @Produces(MediaType.APPLICATION_OCTET_STREAM_VALUE) 
    public ResponseEntity getFileStream(@RequestParam("name") String name) { 
     LOG.info("Processing for filename: " + name); 
     try { 
      Path p = fds.getFilePath(name); 
      org.apache.hadoop.fs.FSDataInputStream is = fds.getFileStream(p); 

      return ResponseEntity.ok().header("Content-Disposition", "attachment; filename=\"" + p.getName() + "\"'").contentLength(fds.getFileLength(p)) 
        .contentType(MediaType.APPLICATION_OCTET_STREAM).body(new InputStreamResource(is)); 

     } catch (Exception e) { 
      LOG.error(e.getLocalizedMessage(), e); 
      return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); 
     } finally { 
      LOG.info("File: " + name + " download started"); 
     } 
    } 

答えて

3

InputStreamでラッパーを作成し、ストリーム終了時にフラグをトリガーできます(close())。

たとえば、あなたは基礎としてProxyInputStreamを取ることができます:

ProxyInputStreamis = new ProxyInputStream(fds.getFileStream(p)) { 
    @Override 
    public void close() throws IOException { 
      super.close(); 
      // some trigger 
    } 
}; 
+0

これは便利です。ありがとうございました。しかし、私はまだファイルが完全にダウンロードされたかどうかを区別する方法を知らない、またはたとえば操作が中止されました。 – Luk

+1

'ProxyInputStream'は実装' CountingInputStream'を持っています。これを使用してファイルサイズを 'close()'メソッドの読み込みバイト数と比較することができます – Andremoniy

+0

ありがとうございました! – Luk

関連する問題