I have a servlet that creates a dynamic Excel spreadsheet using Apache POI
. I can create the spreadsheet just fine. However, when I use Google Chrome
and a Tomcat
server, the downloaded file does not reflect the correct filename. Instead, it replaces the filename with the name of the servlet. So, for example, I want to download a file “dr_3.xlsx”, it would instead download a file called “excelService” (the name of the servlet). All the contents are correct, just the file name is wrong.
This bug only occurs when using Google Chrome on a Tomcat Server. It performs as expected when using Firefox + Tomcat
, Chrome + Jetty
, Firefox + Jetty
, and IE(eww) + Tomcat
.
This is the code for the doGet() method:
protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException
{
int id = Integer.parseInt(req.getParameter("id"));
int BUFFER = 1024 * 100;
resp.setContentType( "application/octet-stream" );
resp.setHeader( "Content-Disposition:", String.format("attachment; filename=\"%s\"", "dr_" + id + ".xlsx"));
OutputStream outputStream = resp.getOutputStream();
byte[] bytes = buildFile(id);
resp.setContentLength(bytes.length);
resp.setBufferSize( BUFFER );
outputStream.write(bytes);
outputStream.close();
}
Just to reiterate: The Excel file is fine. The name of the file is incorrect.
Thanks ahead of time for your help.
Thanks to Fedy2, removing the colon from "Content-Disposition"
worked.
Answer:
Try without the quotes:
resp.setHeader( "Content-Disposition:", String.format("attachment; filename=%s", "dr_" + id + ".xlsx"));
Also, check out this SO discussion.