Jetty: загрузка файла клиента

У меня есть java-приложение, на котором работает Jetty и содержит несколько сервлетов и некоторые компоненты. Все это обрабатывается с помощью файла .war.

Архитектура уже довольно большая, и я еще не разбираюсь во всех ее концепциях, так что извините за невежество.

То, что я хотел бы сделать, очень просто. Я создал новый сервлет, указывающий на URL-адрес: filedl.

Я бы просто хотел сохранить там файл, который клиент может загрузить. Например, для URL-адреса: myapp/filedl/my_file.txt

Мне нужен только какой-то список каталогов, и я разрешаю доступ только к этому каталогу.

Позже подумаю над добавлением аутентификации, но это уже другая проблема.

Основная проблема здесь в том, что я полностью теряюсь во всех концепциях Jetty, и поиск файла загрузки jety в Google возвращает множество глупых результатов.

Любые направления были бы очень признательны!

Спасибо.

ИЗМЕНИТЬ:

Спасибо #npe, теперь я могу загружать файлы. Однако остается еще одна странная вещь:

  • Я установил сопоставление URL-адресов как /filedl, но я могу загружать файлы из / . Я хотел бы разрешить dl только в /filedl
  • Какой бы файл я ни загружал, он называется filedl.
  • У меня нет доступа к списку файлов (ошибка 500), хотя у меня есть
  <init-param>
     <param-name>dirAllowed</param-name>
     <param-value>true</param-value>
  </init-param>

в моем военном файле

Есть идеи, откуда это?

Спасибо еще раз!


person jlengrand    schedule 22.06.2012    source источник


Ответы (1)


Это не имеет ничего общего с Jetty.

То, что вы пытаетесь сделать, это создать Servlet, который обслуживает статические файлы.

Теперь, чтобы сделать это, вам нужно реализовать что-то вроде этого:

@WebServlet(name="myAwesomeServlet", urlPatterns={"/filedl"})
public class MyAwesomeServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String fileName = (String) request.getParameter("file");
        FileInputStream fis = null;

        try {

            fis = new FileInputStream(fileName);
            response.setContentType("application/octet-stream"); 

            OutputStream out = response.getOutputStream();
            IOUtils.copy(fis, out); // this is using apache-commons, 
                                    // make sure you provide required JARs

        } finally {            

            IOUtils.closeQuietly(out);  // this is using apache-commons, 
            IOUtils.closeQuietly(fis);  // make sure you provide required JARs

        }

    }
}

Если вы не можете использовать Servlet 3.0 API, избавьтесь от аннотации @WebServlet и сопоставьте сервлет вручную в файле web.xml.

Затем просто вызовите URL следующим образом:

http://your.awesome.server.com/filedl?file=path/to/file 

Если вы хотите, чтобы URL-адреса были более RESTful, например:

http://your.awesome.server.com/filedl/file/path/to/file 

вам нужно внести некоторые изменения в способ анализа параметров. Я оставлю это вам в качестве упражнения. Этот случай также может быть хорошим для реализации в качестве службы REST (см.: Создание веб-служб RESTful с помощью JAX-RS — Учебное пособие по Java EE 6).

Редактировать

Если вы хотите как-то ограничить загружаемые файлы в одну папку, вам нужно реализовать это самостоятельно. Например, вы можете принудительно искать все файлы в определенной папке следующим образом:

String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);

...
fis = new FileInputStream(realFileName);

Таким образом, URL-адреса типа /fieldl/someFile.txt fill вызывают показ файла из /my/restricted/folder/someFile.txt.

person npe    schedule 22.06.2012
comment
Спасибо за информацию, меня беспокоит Jetty в основном из-за того, что я постоянно получаю 404. я не могу найти способ получить корневую папку моего веб-приложения. Тот факт, что я новичок в веб-разработке, конечно, не помогает: с - person jlengrand; 22.06.2012
comment
Попробуйте выполнить это в своем сервлете: new File(".").getAbsolutePath() должно показать вам, где на пути вы запускаете сервлет. - person npe; 22.06.2012
comment
Эй, я могу скачать файлы, спасибо :). У меня все еще есть проблема. Смотрите мое редактирование - person jlengrand; 22.06.2012
comment
Не уверен, о чем вы просите... Какая еще проблема? - person npe; 22.06.2012
comment
Все еще не уверен, но обновил ответ, указав способ ограничения доступа к файловой системе. Узнайте, как File(String, String) работает. - person npe; 22.06.2012