Я читал здесь, что в любом случае не следует сохранять файл на сервере, поскольку он не переносится, не требует транзакций и требует внешних параметров. Однако, учитывая, что мне нужно решение tmp для tomcat (7) и что у меня есть (относительный) контроль над серверной машиной, я хочу знать:
Как лучше всего сохранить файл? Следует ли мне сохранить его
/WEB-INF/uploads
( здесь не рекомендуется ) или где-то ниже$CATALINA_BASE
(см. Здесь ) или ...? Учебник по JavaEE 6 получает путь от пользователя (: wtf :). NB: файл ни в коем случае нельзя скачивать.Следует ли мне настроить параметр конфигурации, как описано здесь ? Я был бы признателен за некоторый код (я бы предпочел дать ему относительный путь - так что это, по крайней мере, переносимый Tomcat) -
Part.write()
выглядит многообещающе - но, очевидно, нужен абсолютный путьМне было бы интересно рассказать о недостатках этого подхода по сравнению с репозиторием базы данных / JCR.
К сожалению, FileServlet по @BalusC концентрируется на загрузку файлов, а его ответ на загрузки файлов пропускает часть о том, куда сохранить файл.
Было бы предпочтительнее решение, легко конвертируемое для использования БД или реализации JCR (например, jackrabbit ).
источник
Ответы:
Храните его в любом доступном месте, кроме папки проекта IDE, также известной как папка развертывания сервера, по причинам, указанным в ответе на « Загруженное изображение», доступном только после обновления страницы :
Для меня или кого-либо еще не имеет значения, где именно в файловой системе локального диска он будет сохранен, если вы никогда не используете
getRealPath()
метод . В любом случае использование этого метода вызывает тревогу.Путь к месту хранения, в свою очередь, можно определить разными способами. Вы должны сделать все это сами . Возможно, именно здесь ваше замешательство вызвано тем, что вы каким-то образом ожидали, что сервер сделает все это автоматически. Обратите внимание , что
@MultipartConfig(location)
это не указать конечный пункт назначения загрузки, но место временного хранения размера случае файла превышает порог хранения памяти.Итак, путь к окончательному хранилищу можно определить одним из следующих способов:
HARDCODED:
Переменная среды через
SET UPLOAD_LOCATION=/path/to/uploads
:Аргумент виртуальной машины во время запуска сервера через
-Dupload.location="/path/to/uploads"
:*.properties
запись файла какupload.location=/path/to/uploads
:web.xml
<context-param>
с именемupload.location
и значением/path/to/uploads
:Если есть, используйте расположение, указанное сервером, например, в JBoss AS / WildFly :
В любом случае вы можете легко сослаться на файл и сохранить его следующим образом:
Или, если вы хотите автоматически сгенерировать уникальное имя файла, чтобы пользователи не перезаписывали существующие файлы с одинаковым именем:
Как получить
part
в JSP / Servlet, ответ на вопрос Как загрузить файлы на сервер с помощью JSP / Servlet? и как получитьpart
в JSF, ответ в Как загрузить файл с помощью JSF 2.2 <h: inputFile>? Где сохраненный файл?Примечание: не используйте,
Part#write()
поскольку он интерпретирует путь относительно места временного хранения, определенного в@MultipartConfig(location)
.Смотрите также:
источник
@MultipartConfig(location)
Определяет временное расположение сторга , который сервер должен использовать , если размер файла превышает порог для хранения памяти, а не постоянное место хранения , где вы бы в конечном счете , как он будет храниться. По умолчанию это значение соответствует пути, указанному вjava.io.tmpdir
системном свойстве. См. Также соответствующий ответ на неудачную попытку JSF: stackoverflow.com/questions/18478154/…Part.write
>> Это позволяет конкретной реализации использовать, например, переименование файлов, где это возможно, вместо копирования всех базовых данных, таким образом получая значительное преимущество в производительности в сочетании с некоторыми неизвестный метод "вырезания" (против копирования), скажем, какой-то apache lib избавит меня от необходимости писать байты самому - и воссоздавать уже существующий файл (см. также здесь )Part#write()
. Я обновил ответ этим."jboss.server.data.dir"
?Я публикую свой последний способ сделать это на основе принятого ответа:
где :
и /WEB-INF/app.properties:
HTH, и если вы обнаружите ошибку, дайте мне знать
источник