使用HttpServlet的MSWord文件下载问题

时间:2013-09-17 05:24:42

标签: java servlets download

我已经实现了servlet来下载我的应用程序类路径下可用的doc文件。

发生了什么事;文件正在下载,但ms-word无法打开它的属性。 请参阅ms-word的屏幕截图:

msword screenshot

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

请建议我犯错,或者有其他方法可以实现。

注意:我已尝试过几乎所有可用的方法。

2 个答案:

答案 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工作正常