2017-08-25 2 views
2

Ich habe einfache Rest API erstellt, um Dateien von hdfs zu liefern (Dateien sind groß und ich möchte sie nicht lokal kopieren).Wie überprüft man, ob die Datei vollständig heruntergeladen wurde über Spring Rest Api

Ich möchte Informationen protokollieren, dass Datei-Download erfolgreich abgeschlossen, d. H. Der gesamte Stream wurde gelesen, aber ich weiß nicht wie. Ich kann nur Informationen protokollieren, dass der Dateidownload gestartet wurde.

Ich werde jede Hilfe zu schätzen wissen.

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

Antwort

3

Sie können versuchen, einen Wrapper über Inputstream zu erstellen und einige Flagge Strom auslösen Schließen (close()).

Zum Beispiel können Sie ProxyInputStream als Grundlage nehmen:

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

Dieses hilfreich. Vielen Dank. Aber ich weiß immer noch nicht, wie man unterscheidet, dass die Datei vollständig heruntergeladen wurde oder zum Beispiel die Operation abgebrochen wurde. – Luk

+1

Der 'ProxyInputStream' hat eine Implementierung' CountingInputStream' - Sie können diese verwenden und vergleichen Sie die Dateigröße mit der Anzahl der gelesenen Bytes in der 'close()' Methode – Andremoniy

+0

Vielen Dank! – Luk

Verwandte Themen