我希望用户能够通过 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.xml
和webapps/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/