我有一个驻留在内部网络服务器上的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>
答案 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>