有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个驻留在内部Web服务器上的pdf。我的应用程序中有一个JSP,我必须使用URL访问该pdf。我随身带着网址。任务是,当访问该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) 个答案

  1. # 1 楼答案

    您可以尝试在另一个站点上执行重定向:

    <%@ 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

    下面是一个使用JSP开发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>