".": Неверное расположение @MultipartConfig - PullRequest
1 голос
/ 09 мая 2011

Я хочу, чтобы мой сервлет получал файлы в какой-то папке в дереве каталогов приложения.Сервер принимает файлы в формате multipart / form-data.Я понял, что @MultipartConfig - это правильный атрибут для маркировки кода сервлета, позволяющий серверу создавать файлы.Однако не каждое местоположение считается безопасным, поэтому возникают два вопроса:

  1. Каковы ограничения при указании местоположений для сервлетов загрузки файлов
  2. Могут ли пути быть относительно приложенияпуть или они должны быть абсолютными?
  3. После этого файлы должны быть загружаемыми, поэтому, в общем, это лучшее место на сервере для хранения файлов (под деревом приложений, вне дерева, внеДерево Tomcat и т. Д.?)
  4. Поскольку аннотация является очень «статичным» способом, позволяющим загружать сервлеты, можно ли это указать, например, в web.xml?Спасибо!

1 Ответ

5 голосов
/ 09 мая 2011

1: Каковы ограничения при указании местоположений для сервлетов загрузки файлов

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


2: пути могут быть относительно пути приложения или онидолжно быть абсолютным?

Оба допускаются, если 1) подтверждено.Контейнер под крышками будет использовать java.io.File для обозначения местоположения.Поэтому использование относительных путей определенно является плохой идеей.


3: впоследствии файлы должны быть загружаемыми, поэтому, в общем, это лучшее место на сервере для хранения файловэто (под деревом приложений, вне дерева, из дерева Tomcat и т. д.?)

Помещение в папку webapp приведет к их потере при каждом повторном развертывании webapp.Он также не будет работать на некоторых конфигурациях сервера, поскольку извлечение файла WAR является необязательным параметром конфигурации.Так что действительно лучше поместить их по фиксированному пути вне папки webapp.Чтобы загрузить их снова, просто добавьте новый <Context> в Tomcat или создайте сервлет, который получает от него FileInputStream и записывает в OutputStream ответа.Примеры можно найти в этом ответе .


4: поскольку аннотация является очень «статичным» способом, позволяющим сервлету загружать файлы, может лито же самое можно указать в web.xml, например?

Да, вы можете просто полностью игнорировать атрибут location аннотации и использовать Part#getInputStream(), чтобы записать его в нужное место,Затем вы можете указать местоположение как <init-param> сервлета и инициализировать его методом init().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...