Home > database >  If attachment file size is more than 16363byte Content-Disposition is not comming in response in Spr
If attachment file size is more than 16363byte Content-Disposition is not comming in response in Spr

Time:02-22

If attachment file size is more than 16363byte Content-Disposition is not comming in response in Spring boot application.

I use Java 8 and Spring boot I need to send zip file with special file name.

HttpServletResponse response;

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
ZipOutputStream zip = new ZipOutputStream(byteArrayOutputStream);
zip.putNextEntry(new ZipEntry(foldername));
objectMapper.writerWithDefaultPrinter().writeValue(zip, list);
zip.closeEntry();
byteArrayOutputStream.writeTo(responseOutputStream);

ContentDisposition contentDisposition = ContentDisposition.type("attachment").fileName(fileName).build()
response.addHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());

I don't want to use solution like File file = createTempCSVFile(); because I need always control attachment file.

CodePudding user response:

Response headers must be sent before the response body. Spring and the servlet container try to buffer the output stream so that you can delay specifing the response headers, but - as you have noticed - this buffer is limited.

You can solve the problem easily by providing the response header before starting to write to the output stream:

ContentDisposition contentDisposition = ContentDisposition.type("attachment").fileName(fileName).build()
response.addHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
ZipOutputStream zip = new ZipOutputStream(byteArrayOutputStream);
zip.putNextEntry(new ZipEntry(foldername));
objectMapper.writerWithDefaultPrinter().writeValue(zip, list);
zip.closeEntry();
byteArrayOutputStream.writeTo(responseOutputStream);
  • Related