0

I have requirement where a user can upload a file and later if other user see that he can download a file. New requirement suggest that now a user can upload multiple attachments and any user who see it can download multiple attachment as well.

So i took a list in which attachments are added and direct it to download controller, i changed the earlier line and kept a for-loop but during download only first attachment is downloaded and later it gives exception stream is closed.Below is the code of controller.Please let me know how can i over come this?

@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 Answers1

0

practically you cannot download all the files at once. Because, once you open a stream and write the file content to the stream, you have to close the stream.

When you add the files in for loop, you have to append the file content instead of file, which is not an expected behavior.

When you want to download multiple files at once, you have to zip the files and download.

check this link: download multiple files

Anupama Boorlagadda
  • 1,158
  • 1
  • 11
  • 19