【问题标题】:Java HttpServlet how to download excel fileJava HttpServlet如何下载excel文件
【发布时间】:2014-10-28 14:53:33
【问题描述】:

我正在尝试向我的网络应用程序添加一个功能,让用户可以下载 Excel 文件。

我正在尝试使用以下代码实现此目的:

@Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        File file = new File("d:/test/test.xls");
        response.setContentType("application/xls");
        response.addHeader("Content-Disposition", "attachment; filename=test.xls");
        response.setContentLength((int) file.length());

        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            OutputStream responseOutputStream = response.getOutputStream();
            int bytes;
            while ((bytes = fileInputStream.read()) != -1) {
                responseOutputStream.write(bytes);
            }
            fileInputStream.close();
            responseOutputStream.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

我可以使用上述代码下载 excel 文件,但是文件已损坏。如果我用 microsoft excel 打开它,我会弹出一个消息:

“文件格式和扩展名不匹配。文件可能已损坏或不安全”。

而且excel文件是空的。

运行代码后,原始文件(d:/test/test.xls) 也会损坏。

我做错了什么?

【问题讨论】:

  • 在尝试下载之前确定excel文件有效吗?会不会在处理之前就已经损坏了?
  • 是的,我很确定。
  • 好吧,可以肯定的是,您发布的代码肯定不会修改或损坏您的 Excel 文件。
  • 您的文件大小是多少?会不会很大?
  • 为什么不将文件作为块而不是按字节读取?类似this.

标签: java excel http servlets download


【解决方案1】:

Excel 文件 .xls 的官方 MIME 类型是 application/vnd.ms-excel,.xlsx 的官方 MIME 类型是 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet。

另外,我建议在写入输出流之前执行response.reset(),在关闭response 之前执行responseOutputStream.flush()(重要)。

【讨论】:

    【解决方案2】:

    试试下面的代码:

        File file = null;
        InputStream in = null;
        OutputStream outstream = null;
        try {
          response.reset();
          in = new FileInputStream(file);
          response.setContentType("application/vnd.ms-excel");
          response.addHeader("content-disposition", "attachment; filename=data.xls");
          outstream = response.getOutputStream();
          IOUtils.copyLarge(in, outstream);
         }
        catch (Exception e) {
            out.write("Unable to download file");
        }finally {
            IOUtils.closeQuietly(outstream);
            IOUtils.closeQuietly(in);
            IOUtils.closeQuietly(out);
            if (file != null)
                file.delete();
        }
    

    别忘了在你的依赖中添加 apache commons-io-2.4

    【讨论】:

    • "IOUtils.closeQuietly(out);" - 出了什么..?
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2021-02-15
    相关资源
    最近更新 更多