Jsp - 访问pdf - 使用URL-“保存或打开”窗口在单击时显示错误

时间:2014-10-24 18:23:57

标签: java jsp java-ee pdf redirect

我有一个驻留在内部网络服务器上的pdf。我的应用程序中有一个JSP,我必须使用URL访问该pdf。我有我的URL。任务是,当访问该URL时,应该下载pdf。

我使用了以下代码。它打开了所需的保存或打开对话框,但当我点击打开它说的pdf时, adobe reader无法打开'pdf',因为它不是支持的文件类型,或者因为文件有被损坏了。我在这里缺少任何标题吗?

<%@ page import="java.io.*,java.util.*" %>
<html>
    <head/>
    <body>
        <%
            String site = new String("http://chfvld/manuals/zseriessection12.pdf");
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "attachment; filename=zseriessection12.pdf");
            response.setHeader("Location", site);   
        %>
    </body>
</html>

1 个答案:

答案 0 :(得分:0)

您可以尝试在其他网站上进行重定向:

<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
</head>
<body>
<%
response.setStatus(javax.servlet.http.HttpServletResponse.SC_MOVED_PERMANENTLY)
response.setHeader("Location", "http://chfvld/manuals/zseriessection12.pdf");   
%>
</body>
</html>

Web浏览器能够理解您将返回状态代码301(永久移动)并将转到您定义的位置。 但是,如果您不希望向访问JSP的用户公开内部Web服务器,则必须创建一个小代理来完成这一操作并获取PDF。

以下是Apache Commons HTTP客户端的一个小例子。我没有尝试它可能不起作用,但你会得到这个想法...... 注意:我建议你在servlet中,而不是在JSP中,因为JSP中的scriptlet通常是一个糟糕的设计。)

<%@ page import="java.io.*,java.util.*,org.apache.commons.httpclient.*,org.apache.commons.httpclient.methods.*" %>
<html>
<head>
</head>
<body>
<%
HttpClient client = new HttpClient();
GetMethod method = new GetMethod("http://chfvld/manuals/zseriessection12.pdf");
try {
  // Execute the method.
  int statusCode = client.executeMethod(method);
  if (statusCode != javax.servlet.http.HttpStatus.SC_OK) {
    response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  } else {
      // Read the response body.
      byte[] responseBody = method.getResponseBody();
      response.setContentType("application/pdf");
      response.setHeader("Content-Disposition", "attachment; filename=zseriessection12.pdf");
      response.getOutputStream().write(responseBody);
} catch (Exception e) {
  response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} finally {
  // Release the connection.
  method.releaseConnection();
}  
%>
</body>
</html>