2017-12-18 331 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); 
    }