2016-11-28 42 views
0

我正在使用Spring Boot应用程序,并且在下载大文件时遇到问题。也就是说,当我点击客户端页面中的下载链接时,浏览器下载对话框显示需要很长时间。对于小文件,它会立即显示,但对于大文件,最多需要30秒。无阻塞地下载大文件

这让我觉得我的控制器阻塞,直到文件内容完全写入响应输出流,然后才发送到客户端。我尝试了各种选择,让它立即发送响应,但仍然没有结果。这是我到目前为止有:

@RequestMapping(method = RequestMethod.GET, value = "/content/file/download") 
public ResponseEntity<InputStreamResource> downloadFile(@RequestParam(name = "path") String path, HttpServletRequest request) 
      throws IOException, NotFoundException, BadRequestException, InternalServerErrorException{ 
    getApplicationId(request); 
    String orgId = getOrganizationId(request); 
    LOGGER.debug("Downloading for path {}", path); 

    try{ 
     Session session = getCurrentSession(request); 
     FileStorageService service = new JCRFileStorageService(session); 
     ProtonItem item = service.getItem(path, orgId); 

     InputStream is = service.getFileDownloadStream(path, orgId); 
     InputStreamResource resource = new InputStreamResource(is); 

     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentLength(item.getMetadata().getMetadata(ProtonBaseConstants.META_FILE_SIZE, Long.class)); 
     headers.set(HttpHeaders.CONTENT_TYPE, item.getMetadata().getMetadata(ProtonBaseConstants.META_MIME_TYPE, String.class)); 
     headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + item.getName()); 

     return ResponseEntity.ok().headers(headers).body(resource); 


    } catch(ProtonRepoException ex){ 
     throw ProtonExceptionMapper.processException(ex); 
    } 
} 

各种信息来源的在线点,这应该是足够了下载立即开始,但它不工作。我尝试使用IOUtils.copy(),直接从输入到输出流复制,但似乎没有任何工作。

有什么我失踪了吗?也许一些Spring Boot配置,或者其他什么?

+1

什么是'service.getFileDownloadStream'正在做...读取内存中的某个字节[]'也许?与其猜测,您可能想要将度量指标添加到您的应用程序中,以找出需要很长时间的问题。 –

+0

不,这个方法只是将'InputStream'返回到底层文件。我确实检查过了,这不是问题,只需要几个毫秒即可完成。 – vdjurovic

+0

你如何创建大文件?例如SQL结果集映射到对象,然后映射到文件,如果是这种情况,则直接跳过结果集中的映射和流。 – Ibrahim

回答

-1

要回答我的问题......事实证明,问题并不在服务器端所有,而是在客户端。我测试了两个不同的客户端,下载按预期工作,即。立即开始。

原始问题来自我们正在使用的Angular客户端,与服务器端无关。

对不起浪费大家的时间。非常感谢你帮助,伙计们。

+0

我不明白这个答案。你测试的这些客户端是什么?这似乎更像是评论而不是答案。 –

+0

我们使用Angular应用作为前端。它使用GET请求向服务器下载文件。问题在于,这与浏览器GET不同,即。浏览器下载窗口在文件完全下载之前不会显示。 – vdjurovic