我已经实现了servlet
来下载我的应用程序类路径下可用的doc文件。
ms-word
无法打开它的属性。
请参阅ms-word
的屏幕截图:
Servlet
实施如下:
public class DownloadFileServlet extends HttpServlet {
protected void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String fileName = "test.doc";
ClassPathResource resource = new ClassPathResource(File.separator + fileName);
ServletOutputStream sos = null;
FileInputStream fis = null;
try {
response.setContentType("application/msword");
response.setHeader("Content-disposition", "attachment; fileName=\"" + fileName + "\"" );
fis = new FileInputStream(new File(resource.getURI().getPath()));
byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(fis);
sos = response.getOutputStream();
sos.write(bytes);
sos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if( fis != null) {
fis.close();
}
if( sos != null) {
sos.close();
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
我已经为ms-word
文件尝试了几乎所有建议的内容类型。但它仍然没有用。
application/msword
application/ms-word
application/vnd.ms-word
请建议我犯错,或者有其他方法可以实现。
注意:我已尝试过几乎所有可用的方法。
答案 0 :(得分:1)
而不是读取,转换为byte []只需直接写入OutputStream
。您不应该关闭容器为您处理的OutputStream
。
我会将你的servlet方法重写为或多或少以下(为什么它是一个servlet而不是(@)Controller
?
protected void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String fileName = "test.doc";
ClassPathResource resource = new ClassPathResource(File.separator + fileName);
InputStream input = resource.getInputStream();
try {
response.setContentType("application/msword");
response.setHeader("Content-disposition", "attachment; fileName=\"" + fileName + "\"" );
org.springframework.util.StreamUtils.copy(input, response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOEXception ie) {}
}
}
}
答案 1 :(得分:0)
我不知道ClassPathResource类是做什么的。因此修改了一下代码。
ClassLoader clsLoader = Thread.currentThread()。getContextClassLoader();
InputStream is = clsLoader.getResourceAsStream(“test.doc”);
并在try块中使用:
byte [] bytes = org.apache.commons.io.IOUtils.toByteArray(is);
这应该可以正常工作。我把doc放在了classpath中。修改它以满足您的需求。
关于mime映射,打开服务器属性,你会发现一个mime映射列表。例如。在eclipse for tomcat中,只需双击服务器,你就可以在那里找到mime映射列表。 application / msword工作正常