我正在使用下一个类(为了便于理解而简化)在struts web应用程序中下载图像.它在每个浏览器中运行良好,但firefox,它切割包含空格的名称.这就是说:带有spaces.pdf的文件在firefox中下载为:file,而在chrome中,IE7 IE6作为文件下载到spaces.pdf.
public class Download extends Action { private static final int BUFFER_SIZE = 4096; public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String filename = "file with spaces.pdf"; File file = ... // variable containing the file; response.setStatus(HttpServletResponse.SC_OK); response.setContentType(getMimeType(request, file)); response.setHeader("Content-Type", getMimeType(request, file)); response.setHeader("Content-Disposition","attachment; filename="+ filename); InputStream is = new FileInputStream(file); sendFile(is, response); return null; } protected String getMimeType(HttpServletRequest request, File file) { ServletContext application = super.servlet.getServletContext(); return application.getMimeType(file.getName()); } protected void sendFile(InputStream is, HttpServletResponse response) throws IOException { BufferedInputStream in = null; try { int count; byte[] buffer = new byte[BUFFER_SIZE]; in = new BufferedInputStream(is); ServletOutputStream out = response.getOutputStream(); while(-1 != (count = in.read(buffer))) out.write(buffer, 0, count); out.flush(); } catch (IOException ioe) { System.err.println("IOException in Download::sendFile"); ioe.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } } }
有谁知道这里发生了什么?注意我在Windows Vista下使用firefox 3.0.3.
文件名应该是带引号的字符串.(根据RFC 2616的第19.5.1节)
response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");