java 内容处理附件不起作用 - 将位打印到屏幕
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6173454/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Content-Disposition attachment doesn't work - prints bits to screen
提问by Piotr0123456
I'm trying to download a PDF file in Struts Action class. Problem is that using
我正在尝试在 Struts Action 类中下载 PDF 文件。问题是使用
response.setHeader("Content-Disposition", "attachment;filename=file.pdf");
I want to open box for "save/open", but now PDF content is writen in browser: ex.
我想打开“保存/打开”框,但现在 PDF 内容是在浏览器中写入的:例如。
%PDF-1.4 28 0 obj << /Type /XObject /Subtype /Image /Filter /DCTDecode /Length 7746 /Width 200 /Height 123 /BitsPerComponent 8 /ColorSpace /DeviceRGB >>...(cut)
I was trying this code (below) under Chrome, Firefox and IE and everywhere this same. Also I was using different PDF files for that.
我正在 Chrome、Firefox 和 IE 下尝试此代码(如下),并且到处都一样。此外,我为此使用了不同的 PDF 文件。
My code fragment:
我的代码片段:
try {
URL fileUrl = new URL("file:///" + filePath);
URLConnection connection = fileUrl.openConnection();
inputStream = connection.getInputStream();
int fileLength = connection.getContentLength();
byte[] outputStreamBytes = new byte[100000];
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=file.pdf");
response.setContentLength(fileLength);
outputStream = response.getOutputStream();
int iR;
while ((iR = inputStream.read(outputStreamBytes)) > 0) {
outputStream.write(outputStreamBytes, 0, iR);
}
return null;
} catch (MalformedURLException e) {
logger.debug("service", "An error occured while creating URL object for url: "
+ filePath);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
} catch (IOException e) {
logger.debug("service", "An error occured while opening connection for url: "
+ filePath);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
} finally {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
inputStream.close();
}
return null;
Is something still missing?
还缺少什么吗?
EDIT
编辑
When I use this code in the Struts class it does not work, but when I use this code in the Servlet it is working. The strangest thing is that when I in action class write only "response.sendRedirect()" to Servlet (and all logic is in Servlet) it is not working too.
当我在 Struts 类中使用此代码时,它不起作用,但当我在 Servlet 中使用此代码时,它正在工作。最奇怪的是,当我在操作类中只向 Servlet 写入“response.sendRedirect()”(并且所有逻辑都在 Servlet 中)时,它也不起作用。
When I analyzed the response headers everything in these three examples is the same.
当我分析响应头时,这三个示例中的所有内容都是相同的。
回答by Vineet Reynolds
Try changing the Content-Type header to something not recognizable by the browser. Instead of
尝试将 Content-Type 标头更改为浏览器无法识别的内容。代替
response.setContentType("application/pdf");
use
利用
response.setContentType("application/x-download");
This will prevent the browser from acting upon the content of the body (which includes the handling of the content by plugins), and will force the browser to display the 'Save File' dialog box.
这将阻止浏览器对正文的内容进行操作(包括插件对内容的处理),并将强制浏览器显示“保存文件”对话框。
Additionally, it might also be useful to verify if the presence of a single whitespace after the semicolon in the Content-Disposition header, is necessary to trigger the required behavior. Therefore, instead of the following line
此外,验证 Content-Disposition 标头中分号后是否存在单个空格对于触发所需行为也可能很有用。因此,而不是以下行
response.setHeader("Content-Disposition", "attachment;filename=file.pdf");
use the following instead.
请改用以下内容。
response.setHeader("Content-Disposition", "attachment; filename=file.pdf");