我有我的服务器我需要的用户从客户端下载的PDF文件。
使用Spring框架,我用javax.servlet.http.HttpServletResponse创建正确的反应和相应的头:
response.setHeader("Expires", "-1");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename="content.pdf");
response.setContentLength(content.size());
然后,我用的是ServletOutputStream的写的内容:
ServletOutputStream os;
try {
os = response.getOutputStream();
os.write(((ByteArrayOutputStream)baos).toByteArray());
baos.close();
os.flush();
os.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
在客户端,我收到HTTP代码200和接收正确的响应体,与PDF文件,但“另存为...”弹出窗口没有出现。
有页眉的配置,可能导致该问题或可能是别的地方的原因吗?
谢谢。
也许:
attachment;
空间 filename=content.pdf
更新
public static void download(HttpServletResponse response, File file, String downloadName) throws IOException
{
if(file == null) throw new IllegalArgumentException("file is null");
response.reset();
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setContentType(new MimetypesFileTypeMap().getContentType(file));
response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadName + "\"");
InputStream input = new FileInputStream(file);
try
{
OutputStream output = response.getOutputStream();
try
{
IOUtils.copy(input, output);
}
catch(IOException e)
{
e.printStackTrace();
throw e;
}
finally
{
output.close();
}
}
catch(IOException e)
{
throw e;
}
finally
{
input.close();
}
}
而我看到的唯一区别是在报头部分。 你试过没有缓存控制,编译和过期?
更新
没有差异在所有使用文件或流:
public static void download(HttpServletResponse response, InputStream input, String downloadName, String contenType) throws IOException
{
response.reset();
response.setHeader("Content-Length", String.valueOf(input.available()));
response.setContentType(contenType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadName + "\"");
OutputStream output = response.getOutputStream();
IOUtils.copy(input, output);
input.close();
}
尝试将内容类型设置为application/octet-stream
来代替:
response.setContentType("application/octet-stream");
这应该强制浏览器显示“另存为...”弹出窗口。 如果你把它设置为application/pdf
浏览器识别文件类型,并显示它来代替。
当我运行这段代码的问题排在
response.setHeader("Content-Disposition", "attachment;filename="content.pdf");
定义文件名
尝试:
response.setHeader("Content-Disposition", "attachment;filename="+"content.pdf");
这将打开对话框,并会给你点击Save按钮保存时作为选件