Search code examples
javaspringspring-3content-disposition

How to set 'Content-Disposition' and 'Filename' when using FileSystemResource to force a file download file?


What is the most appropriate, and standard, way to set the Content-Disposition=attachment and filename=xyz.zip using Spring 3 FileSystemResource?

The action looks like :

@ResponseBody
@RequestMapping(value = "/action/{abcd}/{efgh}", method = RequestMethod.GET, produces = "application/zip")
@PreAuthorize("@authorizationService.authorizeMethod()")
public FileSystemResource doAction(@PathVariable String abcd, @PathVariable String efgh) {

    File zipFile = service.getFile(abcd, efgh);

    return new FileSystemResource(zipFile);
}

Although the file is a zip file so the browser always downloads the file, but I would like to explicitly mention the file as attachment, and also provide a filename that has nothing to do with the files actual name.

There might be workarounds for this problem, but I would like to know the proper Spring and FileSystemResource way to achieve this goal.

P.S. The file that is being used here is a temporary file, marked for deletion when the JVM exists.


Solution

  • @RequestMapping(value = "/action/{abcd}/{efgh}", method = RequestMethod.GET)
    @PreAuthorize("@authorizationService.authorizeMethod(#id)")
    public HttpEntity<byte[]> doAction(@PathVariable ObjectType obj, @PathVariable Date date, HttpServletResponse response) throws IOException {
        ZipFileType zipFile = service.getFile(obj1.getId(), date);
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        response.setHeader("Content-Disposition", "attachment; filename=" + zipFile.getFileName());
    
        return new HttpEntity<byte[]>(zipFile.getByteArray(), headers);
    }