下载大文件而不会阻止

时间:2016-11-28 14:10:22

标签: spring spring-mvc spring-boot

我正在使用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配置,还是别的什么?

2 个答案:

答案 0 :(得分:0)

使用byte []而不是InputStreamResource,请点击此链接..它在我以前的一个项目中对我有用。它应该适合你。

http://www.benashby.com/spring/2013/10/30/serving-large-files-spring-mvc.html

答案 1 :(得分:-1)

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

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

抱歉浪费每个人的时间。非常感谢你们帮助,伙计们。