Ответ 1
Я хотел бы сохранить его в "ресурсах/изображениях" приложения
Нет, пожалуйста, не надо. Пространство развертывания WAR не предназначено для постоянного хранения файлов. Все эти загруженные файлы будут потеряны всякий раз, когда вы повторно развертываете webapp по той простой причине, что они не содержатся в исходной WAR. См. Подробное объяснение и ответ на очень близкий вопрос: Загруженное изображение доступно только после обновления страницы.
В настоящий момент файл переходит к "domain1\generated\jsp\FileUpload".
Потому что вы указали относительный путь в Part#write()
. Он становится относительно текущего рабочего каталога, который вы не контролируете. См. Подробное объяснение и этот ответ: getResourceAsStream() vs FileInputStream. Вам нужно указать абсолютный путь, другими словами, запустить путь с помощью /
.
Учитывая, что вы используете Glassfish, ответ в Загруженном изображении, доступном только после обновления страницы, также должен сделать это за вас. В двух словах:
-
Создайте папку
/var/webapp/images
. Обратите внимание, что этот путь является просто пробным и полностью бесплатным по вашему выбору. Также обратите внимание, что, когда вы используете Windows с дискомC:\
, этот путь эквивалентенC:\var\webapp\images
. -
Сохраните загруженный файл там.
Path file = Files.createTempFile(Paths.get("/var/webapp/images"), "somefilename-", ".jpg", ); try (InputStream input = uploadedFile.getInputStream()) { Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING); } imageFileName = file.getFileName().toString(); // ...
(примечание:
Files#createTempFile()
используется для автогенерации уникального имени файла, в противном случае ранее загруженный файл будет перезаписан, когда новый загруженный файл (по совпадению) имеет точно такое же имя файла) -
Скажите GlassFish зарегистрировать виртуальный хост на
/var/webapp/images
, чтобы все файлы были доступны вhttp://example.com/images
, добавив следующую запись в/WEB-INF/glassfish-web.xml
веб-сайта:<property name="alternatedocroot_1" value="from=/images/* dir=/var/webapp" />
(примечание:
alternatedocroot_1
должно быть точно так же, не изменяйте его, если у вас его несколько, назовите егоalternatedocroot_2
и т.д., также обратите внимание, что часть/images
не должна быть включена в атрибутdir
, это не опечатка) -
Теперь вы можете отобразить его следующим образом:
<h:graphicImage value="/images/#{bean.imageFileName}" />
(обратите внимание: используйте атрибут
value
, а не атрибутname
)