作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的服务器上有一个 PDF 文件,我需要用户从客户端下载该文件。
使用 Spring 框架,我使用 javax.servlet.http.HttpServletResponse 创建正确的响应和相应的 header :
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 配置是否有任何原因可能导致此问题,或者可能是其他地方?
谢谢。
最佳答案
也许:
附件;
空格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();
}
关于java - 打开/另存为...对话框未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19725342/
我有 json 数据: { "products": [ { "productId" : 0, "productImg" : "../img/product-ph
我是一名优秀的程序员,十分优秀!