2017-12-18 333 views
0

我們有一個HTTP請求,當它在服務器中處理時會創建一個大小約爲3GB的響應,這個數據是對數據庫的6個查詢的聚合,我們如何將這些數據作爲單獨的響應發送6個查詢而不是聚合。如何在春季流式傳輸大型HTTP響應

+0

只能返回從一個單一的請求的單一響應。 –

回答

0

我這樣做:

@GetMapping("/{fileName:[0-9A-z]+}") 
    @ResponseBody 
    public ResponseEntity<InputStreamResource> get_File(@PathVariable String fileName) throws IOException { 
     Files dbFile = fileRepository.findByUUID(fileName); 

     if (dbFile.equals(null)) 
      return new ResponseEntity<>(HttpStatus.NOT_FOUND); 

     String filename = dbFile.getFileName(); 
     Resource file = storageService.loadAsResource(dbFile.getFileName()); 


     long len = 0; 
     try { 
      len = file.contentLength(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     MediaType mediaType = MediaType.valueOf(FileTypeMap.getDefaultFileTypeMap().getContentType(file.getFile())); 

     if (filename.toLowerCase().endsWith("mp4") || filename.toLowerCase().endsWith("mp3") || 
       filename.toLowerCase().endsWith("3gp") || filename.toLowerCase().endsWith("mpeg") || 
       filename.toLowerCase().endsWith("mpeg4")) 
      mediaType = MediaType.parseMediaType("application/octet-stream"); 


     InputStreamResource resource = new InputStreamResource(new FileInputStream(file.getFile())); 

     return ResponseEntity.ok() 
       .contentType(mediaType) 
       .contentLength(len) 
       .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"") 
       .body(resource); 
    }