Храните его в любом доступном месте, кроме папки проекта IDE, также известной как папка развертывания сервера, по причинам, указанным в ответе на « Загруженное изображение», доступном только после обновления страницы :
Изменения в папке проекта IDE не сразу отражаются в рабочей папке сервера. В среде IDE есть своего рода фоновое задание, которое заботится о том, чтобы рабочая папка сервера синхронизировалась с последними обновлениями (в терминах IDE это называется «публикация»). Это основная причина проблемы, которую вы видите.
В реальном коде бывают ситуации, когда сохранение загруженных файлов в папке развертывания веб-приложения вообще не работает. Некоторые серверы (либо по умолчанию, либо по конфигурации) не разворачивают развернутый файл WAR в файловую систему локального диска, а полностью в памяти. Вы не можете создавать новые файлы в памяти, не отредактировав развернутый файл WAR и не повторно развернув его.
Даже когда сервер разворачивает развернутый файл WAR в файловую систему локального диска, все вновь созданные файлы будут потеряны при повторном развертывании или даже при простом перезапуске просто потому, что эти новые файлы не являются частью исходного файла WAR.
Для меня или кого-либо еще не имеет значения, где именно в файловой системе локального диска он будет сохранен, если вы никогда не используете getRealPath()
метод . В любом случае использование этого метода вызывает тревогу.
Путь к месту хранения, в свою очередь, можно определить разными способами. Вы должны сделать все это сами . Возможно, именно здесь ваше замешательство вызвано тем, что вы каким-то образом ожидали, что сервер сделает все это автоматически. Обратите внимание , что @MultipartConfig(location)
это не указать конечный пункт назначения загрузки, но место временного хранения размера случае файла превышает порог хранения памяти.
Итак, путь к окончательному хранилищу можно определить одним из следующих способов:
HARDCODED:
File uploads = new File("/path/to/uploads");
Переменная среды через SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Аргумент виртуальной машины во время запуска сервера через -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
запись файла как upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
с именем upload.location
и значением /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Если есть, используйте расположение, указанное сервером, например, в JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
В любом случае вы можете легко сослаться на файл и сохранить его следующим образом:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Или, если вы хотите автоматически сгенерировать уникальное имя файла, чтобы пользователи не перезаписывали существующие файлы с одинаковым именем:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Как получить part
в JSP / Servlet, ответ на вопрос Как загрузить файлы на сервер с помощью JSP / Servlet? и как получить part
в JSF, ответ в Как загрузить файл с помощью JSF 2.2 <h: inputFile>? Где сохраненный файл?
Примечание: не используйте, Part#write()
поскольку он интерпретирует путь относительно места временного хранения, определенного в @MultipartConfig(location)
.
Смотрите также: