例外:在下载多个附件时关闭流

时间:2017-06-30 04:52:56

标签: java spring-boot

我要求用户可以上传文件,以后如果其他用户看到他可以下载文件。新要求表明,现在用户可以上传多个附件,任何看到它的用户也可以下载多个附件。

所以我拿了一个列表,其中添加了附件并将其指向下载控制器,我更改了前一行并保持了for循环,但在下载期间只下载了第一个附件,后来它关闭了异常流.Below is控制器的代码。请让我知道我怎么能来这个?

@ApiOperation(value = "Download content")
@RequestMapping(value = "/api/content/{id}/download/", method = RequestMethod.GET)
public ResponseEntity<String> downloadContent(HttpServletResponse response, @PathVariable("id") final Long id)
        throws IOException, APIException {
    Content content = null;
    try {
        content = this.contentService.get(this.contentUtils.getContentObject(id));
    } catch (ServiceException e) {
        throw new APIException("Access denied");
    }
    if (null == content) {
        throw new APIException("Invalid content id");
    }
    List<Document> documentList = this.contentService.getDocumentByContent(content);
    if (documentList != null && !documentList.isEmpty()) {
        //Document document = documentList.get(0); //If multiple files supported?, then need to be handled here
        for (Document document : documentList) {
            File file = new File(document.getLocalFilePath());
            if (file.exists()) {
                response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");
                try (InputStream inputStream = new FileInputStream(file); ServletOutputStream sos = response.getOutputStream();) {
                    IOUtils.copy(inputStream, sos);
                } catch (final IOException e) {
                    LOGGER.error("File not found during content download" + id, e);
                    throw new APIException("Error during content download:" + id);
                }
            } else {
                try {
                    s3FileUtil.download(document.getS3Url(), document.getLocalFilePath());
                } catch (S3UtilException e) {
                    throw new APIException("Document not found");
                }
            }
        }
    } else {
        //404
        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity<String>(HttpStatus.OK);
}

1 个答案:

答案 0 :(得分:0)

实际上你不能一次下载所有文件。因为,一旦打开流并将文件内容写入流,就必须关闭流。

for循环中添加文件时,必须附加文件内容而不是文件,这不是预期的行为。

  

如果要一次下载多个文件,则必须压缩   文件和下载。

点击此链接:download multiple files