我的服务器上有一个PDF文件,我需要用户从客户端下载。
使用Spring Framework,我使用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文件接收正确的响应正文,但没有出现“另存为...”弹出窗口。
Header配置上是否有任何可能导致此问题的原因或者是否可能是其他地方?
谢谢。
答案 0 :(得分:0)
也许:
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();
}
答案 1 :(得分:0)
尝试将内容类型设置为application/octet-stream
:
response.setContentType("application/octet-stream");
这会强制浏览器显示“另存为...”弹出窗口。如果将其设置为application/pdf
,则浏览器会识别文件类型并显示它。
答案 2 :(得分:0)
当我运行此代码时,问题出现在
中response.setHeader("Content-Disposition", "attachment;filename="content.pdf");
用于定义文件名
尝试:
response.setHeader("Content-Disposition", "attachment;filename="+"content.pdf");
它将打开对话框,并在单击保存按钮
时为您提供保存选项