我试图显示另存为对话框来保存PDF文件。这应该在单击JSP中的链接时发生。在点击这个链接时,我调用一个struts动作,它准备PDF并转发到另一个我想用于下载框的JSP 'download. JSP '。
我尝试使用'document。execCommand',但似乎这只适用于。txt和。html文件。
然后我尝试通过设置响应头和内容类型来做到这一点。以下是我的download.jsp中的代码。但是这会向我的浏览器写入垃圾字符。
请告诉我这个问题的解决方法。
<%@ page language="java" import="javax.servlet.ServletOutputStream,java.io.BufferedOutputStream,java.io.DataInputStr eam,java.io.File,java.io.FileInputStream"%><%
response.setHeader("Content-Disposition","attachment;filename="" + "mandateOut.pdf" + """);
response.setContentType( "application/pdf" );
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=0");
File file = new File(<fully qualified file name>);
response.setContentLength( (int)file.length() );
// get the OutputStream and buffer our bytes to it
ServletOutputStream outStream = response.getOutputStream();
byte[] buf = new byte[1024];
DataInputStream in = new DataInputStream(new FileInputStream(file));
int len;
while ((in != null) && ((len = in.read(buf)) != -1))
{
outStream.write(buf,0,len);
}
// keep the page from freaking out over our use of it's outputstream
in.close();
outStream.flush();
outStream.close();
%>
您正在使用Struts,一种MVC框架。在这样的框架中,View(其作用是生成HTML标记)被实现为JSP。它应该只包含HTML、JSP EL和JSP标记。没有Java代码。它的默认内容类型是text/html。
控制器的作用是处理表示逻辑,并使用Java操作实现。
在本例中,您不需要生成任何HTML标记。您只需要向响应输出流发送字节。那么为什么要使用JSP来实现呢?这不是它的工作。你应该直接从控制器(即动作)执行。把上面的代码直接放到动作中,一切都应该没问题。
注意:
- 不需要DataInputStream来读取字节。你应该更喜欢BufferedInputStream。 这个流应该在
finally
块中关闭。