2

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

发生了什么;文件正在下载,但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

请建议我犯了一个错误或有任何其他方法可以实现。

注意:我已经尝试了 SO 上几乎所有可用的方法。

4

2 回答 2

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) {}
            }
        }
    }
于 2013-09-17T07:11:19.060 回答
0

我不知道 ClassPathResource 类的作用。因此稍微修改了代码。

类加载器 clsLoader = Thread.currentThread().getContextClassLoader();

InputStream = clsLoader.getResourceAsStream("test.doc");

并在 try 块中使用:

byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(is);

这应该可以正常工作。我将文档放在类路径中。修改它以满足您的需要。

关于 mime 映射,打开您的服务器属性,您将找到 mime 映射列表。例如。在 eclipse for tomcat 中,只需双击服务器,您应该可以在那里找到 mime 映射列表。应用程序/msword 工作正常

于 2013-09-17T05:53:28.447 回答