我要求搜索页面中有用户指南链接。当用户点击链接时,需要从JBOSS中部署的WAR中的WEB-INF \ doc文件夹下载Word或PDF文档。
在搜索页面中,有如下链接 下载PDF文件 点击链接后,用户指南文档应从WEB-INF \ doc文件夹下载并打开
搜索谷歌后,我发现我们需要像这样使用
InputStream resourceContent = context.getResourceAsStream("/WEB-INF/doc/foo.doc");
我的应用程序使用JSP和Servlet作为控制器,在这种情况下我需要在doGet方法中编写以下代码
//获取文件的MIME类型
String mimeType = context.getMimeType(filePath);
if(mimeType == null){
//如果找不到MIME映射,则设置为二进制类型
mimeType =“application / octet-stream”;
}
System.out.println(“MIME type:”+ mimeType);
// modifies response
response.setContentType(mimeType);
response.setContentLength((int) downloadFile.length());
// forces download
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
response.setHeader(headerKey, headerValue);
// obtains response's output stream
OutputStream outStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
inStream.close();
outStream.close();
另外我需要在WEB.XML中配置。
我的理解是点击链接调用Servelt doGet方法下载。
请您帮忙解决这个步骤。
提前致谢
答案 0 :(得分:0)
是的,实施HttpServlet.doGet()
方法
当我处理类似的要求时(早在2008年),我使用此方法为下载(attachment=true
)或直接显示(attachment=false
)文档设置正确的HTTP标头:
public static void setDownloadHeaders(HttpServletResponse aRes,
String aContentType, String aName, boolean anAttachment) {
if (aRes == null) {
throw new IllegalArgumentException(
"HttpServletResponse can't be null.");
}
aRes.setContentType(aContentType);
StringBuffer tmpCd = new StringBuffer(anAttachment ? "attachment;" :
"inline;");
if (aName != null) {
tmpCd.append(" filename=\"").append(aName).append("\";");
}
aRes.setHeader("Content-Disposition", tmpCd.toString());
aRes.setHeader("Pragma", "public");
aRes.setHeader("Cache-Control", "max-age=0");
}
您必须正确选择内容类型。在我直接显示PDF的情况下,它是:
setDownloadHeaders(response, "application/pdf", getPdfFileName(), false);
您不需要在web.xml
中配置任何特殊内容。一切都应该适合你。