java - 如何通过 servlet 提供批量文件下载?

标签 java docker tomcat

我希望用户能够通过 tomcat 容器上的 servlet 下载卷上的文件。

我创建了一个卷和一个容器

$ sudo docker volume create tomcat-volume
$ docker run -d -p 8080:8080 --name tomcat \
  -v tomcat-volume:/usr/local/tomcat \
  tomcat:9.0.10-jre8

并通过浏览器中的localhost:8080部署我的.war文件(编辑conf/tomcat-users.xmlwebapps/manager/META-INF/context.xml 以获得访问权限)。

sudo docker volume inform tomcat-volume 将挂载点指定为 /var/lib/docker/volumes/tomcat-volume/_data/

目录 temp 已包含 saveToDelete.tmp 并且我添加了两个自定义文件以确保确定。 我的 Servlet 中的相关代码是:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html"); 
    PrintWriter pw = response.getWriter();
    pw.append("<!DOCTYPE html>\n");
    pw.append("<html>\n");
    pw.append("<body>\n");

    String link;
    File[] files = (new File("/usr/local/tomcat/temp/")).listFiles();
    for(File f: files) {
        link = String.format("<a href=\"%s\" download>%s</a>", f.getAbsolutePath(), f.getName());
        pw.append(link);
        pw.append("<br>\n");
    }
    pw.append("</body>\n");
    pw.append("</html>\n");
}

生成:

<!DOCTYPE html>
<html>
<body>
<a href="/usr/local/tomcat/temp/safeToDelete.tmp" download>safeToDelete.tmp</a><br>
<a href="/usr/local/tomcat/temp/hej.png" download>hej.png</a><br>
<a href="/usr/local/tomcat/temp/hej.html" download>hej.html</a><br>
</body>
</html>

表明我确实有正确的地址。但是我无法下载这些文件,但出现 404 not found。我已确保每个人都可以读取这些文件:

$ sudo ls -l /var/lib/docker/volumes/tomcat-volume/_data/temp
-rw-r--r-- 1 root root     4 Apr 22 11:31 hej.html
-rw-r--r-- 1 root root  2962 Apr 22 11:31 hej.png
-rw-r--r-- 1 root root     0 Jun 20  2018 safeToDelete.tmp

最佳答案

我是 OP,我用第二个下载 servlet 解决了这个问题。 循环被修改为调用 servlet:

    for(File f: files) {
        String target = "DownloadServlet?" + f.getName();
        link = String.format("<a href=\"%s\" download>%s</a>", target, f.getName());
        pw.append(link);
        pw.append("<br>\n");
    }

DownloadServlet中相关代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String filename = request.getQueryString();

    response.setContentType("APPLICATION/OCTET-STREAM");

    PrintWriter out = response.getWriter();
    response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

    FileInputStream fl = new FileInputStream("/usr/local/tomcat/temp/" + filename);

    int i;
    while ((i = fl.read()) != -1) {
        out.write(i);
    }

    fl.close();
    out.close();
}

关于java - 如何通过 servlet 提供批量文件下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61362495/

相关文章:

node.js - 尝试在Docker容器中安装puppeteer时出错

date - 与Docker容器共享主机时区

http - Tomcat、HTTP、选项

java - 使用 jReddit 时出现 No Such Field 错误

java - 尽管请求中存在 Accept-Encoding header ,但 POST 响应未压缩

java - 让JTable只显示添加的行

java - 什么是NoSuchBeanDefinitionException,我该如何解决?

docker - 错误: readlink/var/lib/docker/overlay2: invalid argument

java - 将子域从 AWS ELB 传递到应用程序服务器

java - 在 Tomcat 7 中部署的 war 在 Linux 上的行为与在 Windows 上的行为不同