我正在使用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配置,或者其他什么?
什么是'service.getFileDownloadStream'正在做...读取内存中的某个字节[]'也许?与其猜测,您可能想要将度量指标添加到您的应用程序中,以找出需要很长时间的问题。 –
不,这个方法只是将'InputStream'返回到底层文件。我确实检查过了,这不是问题,只需要几个毫秒即可完成。 – vdjurovic
你如何创建大文件?例如SQL结果集映射到对象,然后映射到文件,如果是这种情况,则直接跳过结果集中的映射和流。 – Ibrahim