JSP:我正在做一个我必须下载ppt文件的应用程序

时间:2010-05-03 06:17:54

标签: java jsp

我正在开发一个应用程序,其中我必须使用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();
}
%>

有人可以解决这个问题吗?

2 个答案:

答案 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的基本示例。