0

我正在尝试显示另存为对话框来保存 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();

%>
4

1 回答 1

1

您正在使用 Struts,一个 MVC 框架。在这样的框架中,用于生成 HTML 标记的 View 被实现为 JSP。它应该只包含 HTML、JSP EL 和 JSP 标记。没有Java代码。它的默认内容类型是 text/html。

控制器的作用是处理表示逻辑,并使用 Java 动作实现。

在这种情况下,您不需要生成任何 HTML 标记。您只需要将字节发送到响应输出流。那么为什么要使用 JSP 来做到这一点呢?这不是它的工作。您应该直接从控制器执行此操作(即操作)。

将上面的代码直接放到action中,应该一切正常。

注意 :

  • 您不需要 DataInputStream 来读取字节。您应该更喜欢 BufferedInputStream 。
  • 这个流应该在一个finally块中关闭。
于 2013-04-07T08:02:27.007 回答