Как предложить объем файлов для скачивания через сервлет? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть файлы на томе, которые я хочу, чтобы пользователи могли загружать с помощью сервлета в контейнер Tomcat.

Я создал том и контейнер

$ 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

и разверните мой .war файл через localhost:8080 в браузере (после редактирования conf/tomcat-users.xml и webapps/manager/META-INF/context.xml для получения прав доступа).

sudo docker volume inspect tomcat-volume заявляет, что точка монтирования равна /var/lib/docker/volumes/tomcat-volume/_data/

Каталог temp уже содержит saveToDelete.tmp, и я добавил два пользовательских файла, чтобы быть уверенным. Соответствующий код из моего сервлета:

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 не найден. Я убедился, что файлы доступны для чтения всем:

$ 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

1 Ответ

0 голосов
/ 23 апреля 2020

Я OP, и я решил это вторым сервлетом загрузки. L oop модифицируется для вызова сервлета:

    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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...