保存为对话框以保存PDF文件

时间:2013-04-07 03:03:02

标签: java savefiledialog content-disposition

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

%>

1 个答案:

答案 0 :(得分:1)

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

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

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

将上面的代码直接放在动作中,一切都应该没问题。

请注意:

  • 您不需要DataInputStream来读取字节。你应该更喜欢BufferedInputStream。
  • 此流应在finally块中关闭。