我正在开发一个应用程序,其中我必须使用JSP页面下载PPT文件。我使用以下代码,但它无法正常工作。
<% try {
String filename = "file/abc.ppt";
// set the http content type to "APPLICATION/OCTET-STREAM
response.setContentType("APPLICATION/OCTET-STREAM");
// initialize the http content-disposition header to
// indicate a file attachment with the default filename
// "myFile.txt"
String disHeader = "Attachment Filename=\"abc.ppt\"";
response.setHeader("Content-Disposition", disHeader);
// transfer the file byte-by-byte to the response object
File fileToDownload = new File(filename);
FileInputStream fileInputStream = new
FileInputStream(fileToDownload);
int i;
while ((i=fileInputStream.read())!=-1)
{
out.write(i);
}
fileInputStream.close();
out.close();
}catch(Exception e) // file IO errors
{
e.printStackTrace();
}
%>
有人可以解决这个问题吗?
答案 0 :(得分:0)
在顶部,Content-Disposition标题中应该有分号(“attachment *; * filename ...)
在开始设置标头和流之前,你也应该做一个response.reset()。 Internet Explorer对于从安全套接字流式传输文件有非常奇怪的规则,如果不清除缓存头,则无法正常工作。
答案 1 :(得分:0)
不仅Content-Disposition
标头不正确,而且您正在使用JSP而不是Servlet来执行此特定任务。
JSP是一种视图技术。小脚本<% %>
之外的所有内容都将打印到响应中,包括空行字符(如换行符)。它肯定会破坏二进制文件。
你可以修剪JSP文件中的空格,但是十年后不鼓励使用scriptlet,现在考虑bad practice。原始Java代码属于Java类,而不属于JSP文件。真正的解决方案是使用HttpServlet
。
创建一个extends HttpServlet
的类,实现doGet()
方法,将Java代码从JSP文件移动到此方法中,将此servlet映射到某个url-pattern
,您的问题应该消失。您可以找到here此类servlet的基本示例。