2016-05-20 10 views
2

Ich habe einen Controller, der Datei-Stream mit ResponseEntity-Klasse zurückgibt. Aber ich bin nicht sicher, ob die Ressource nach Abschluss der Methode geschlossen ist.Spring - Was ist der richtige Weg zum Antwortdateistream?

@RequestMapping(value = "/VMS-49001/playlist/{listName:.+}") 
@ResponseBody 
public ResponseEntity<?> playlist(HttpServletRequest request, HttpServletResponse response, 
     @PathVariable String listName) throws IOException { 

    String hlsPath = getHLSPath(request.getParameter("dt"), listName, OtuEnum.URLType.HLS); 
    Path filePath = Paths.get(hlsPath); 

    if (filePath.toFile().exists()) { 
     Path fileNamePath = filePath.getFileName(); 
     String fileName = ""; 
     if (fileNamePath != null) { 
      fileName = fileNamePath.toString(); 
     } 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentDispositionFormData(fileName, fileName); 

     return ResponseEntity.ok().contentLength(filePath.toFile().length()) 
       .contentType(MediaType.parseMediaType("application/vnd.apple.mpegurl")).headers(headers) 
       .body(new InputStreamResource(Files.newInputStream(filePath))); 
    } else { 
     String errorMsg = "404 file not found"; 
     return ResponseEntity.status(HttpStatus.NOT_FOUND) 
       .contentType(MediaType.parseMediaType("text/html")) 
       .body(errorMsg); 
    } 
} 

, wenn Sie unter Codefragment zu sehen, Files.newInputStream (filePath) implementiert Verschließbare, so sollte es nach Gebrauch verschlossen werden, aber ich kann den Code zu schließen es nicht finden. :

return ResponseEntity.ok() 
    .contentLength(filePath.toFile().length()) 
    .contentType(MediaType.parseMediaType("application/vnd.apple.mpegurl")) 
    .headers(headers) 
    .body(new InputStreamResource(Files.newInputStream(filePath))); 

Zum Antwortdateistream, ist es gut, die Datei mit diesem Code zu liefern? Oder gibt es einen "richtigen" Ansatz?

Antwort

2

Mit Frühling 4.1 wird Ihr Ansatz funktionieren, es gibt kein Problem darin. Hier ist ein weiterer Ansatz für den Fall, wenn Sie schauen möchten:

@RequestMapping(value = "/VMS-49001/playlist/{listName:.+}") 
public ResponseEntity<byte[]> testphoto() throws IOException { 
    InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg"); 

    final HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.parseMediaType("application/vnd.apple.mpegurl")); 
headers.setContentDispositionFormData(fileName, fileName); 

    return new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED); 
} 
Verwandte Themen