首页 > 解决方案 > 如何从Java中的单个目录下载多个文件

问题描述

同时点击导出或下载时如何下载文件目录下的所有文件?</p>

目前已经获取到文件目录下的所有文件,然后将所有文件放入列表中,遍历所有文件后写入流。但是,在导入第二个文件时,会报告 cannot reset buffer after response has beencommited

问题的根源在这段代码: // response.reset();

代码:</p>

   String filePath = "/code/data/";
    // Get all file addresses of the directory
    List<String> filePathList = getFilePath(filePath);

    //Create thread pool

    for (String str : filePathList){

     download(request, response, str);

   }

    private void download(HttpServletRequest request,  
                HttpServletResponse response,String filePath) {
    File file = new File(filePath);

    //Gets the file name.

    String fileName = file.getName();

    InputStream fis = null;

   try {

    fis = new FileInputStream(file);

    request.setCharacterEncoding("UTF-8");

    String agent = request.getHeader("User-Agent").toUpperCase();

    if ((agent.indexOf("MSIE") > 0) || ((agent.indexOf("RV") != - 1) &&  
                                     (agent.indexOf("FIREFOX") == -1))) {

    fileName = URLEncoder.encode(fileName, "UTF-8");

    } else {

    fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");

    }

    // response.reset();

    response.setCharacterEncoding("UTF-8");

    response.setContentType("application/force-download");
    // Set forced download not to open

    response.addHeader("Content-Disposition",  
                       "attachment; filename=" + fileName);

    response.setHeader("Content-Length", String.valueOf(file.length()));

    byte[] b = new byte[1024];

    int len;

    while ((len = fis.read(b)) != - 1) {

      response.getOutputStream().write(b, 0, len);

    }

    response.flushBuffer();

    fis.close();

    } catch (IOException e) {

    throw new RuntimeException(e);

    }
 }
}

有什么好的解决办法 谢谢

标签: java

解决方案


我没有详细阅读你的代码,因为糟糕的格式让我头疼。

然而,从表面上看,这个服务器端代码似乎试图传递多个文件以响应单个 HTTP 请求。

AFAIK,这是不可能的。HTTP 请求/响应模型不支持这一点。它当然不允许 servlet:

  • 打开响应输出流后更改响应标头
  • 在响应输出流关闭后执行任何操作。

(您的代码似乎正在尝试做这两件事!)

所以,你必须以不同的方式来做。以下是一些可能性:

  1. 在服务器端,将所有要下载的文件组合成(比如说)一个临时 ZIP 文件,然后发送。让用户自行解压 ZIP 文件……或不……随心所欲。

    这通常是最好的方法。想象一下,如果几千个单独的文件意外地落在您的 Web 浏览器的“下载”文件夹中,您会感到多么恼火。

  2. 作为 1. 并且还在客户端做一些事情以透明地从 ZIP 解压缩文件并将它们放在客户端文件系统中的正确位置。

    “某物”可以是嵌入在网页中的自定义 javascript,也可以是用 Java ... 或任何其他语言实现的自定义客户端。(但在前一种情况下,允许沙盒 javascript 在用户不确认每个文件的情况下将文件写入任意位置可能存在安全问题……乏味。)

  3. 您也许可以发送“多部分”文档作为响应。然而,据我所知,大多数浏览器不支持多部分下载;例如,一些浏览器会丢弃除最后一部分之外的所有内容。(注意:多部分不是为此目的而设计的......)

  4. 改变一些事情,使 HTTP 请求一次只从目录下载一个文件,并将一些客户端的东西添加到 1) 从服务器获取文件列表并迭代列表,获取每个文件。

另请参阅:通过单个操作下载多个文件


推荐阅读