Как загрузить файл, используя JSF 2.2 <h: inputFile>? Где находится сохраненный файл?
Я хотел бы иметь возможность загружать файлы в мое веб-приложение JSF2.2, поэтому я начал использовать новый <h:inputFile>
составная часть.
Мой единственный вопрос, как я могу указать место, где файлы будут сохранены на сервере? Я хотел бы получить их как java.io.File
экземпляров. Это должно быть реализовано в компоненте поддержки, но я не совсем понимаю, как.
1 ответ
JSF не сохранит файл в каком-либо заранее определенном месте. Он просто предложит вам загруженный файл во вкусе javax.servlet.http.Part
Экземпляр, который находится за кулисами, временно хранится в памяти сервера и / или в месте временного хранения на диске, о чем вам не следует беспокоиться.
Чтобы сохранить его в нужном месте, вам необходимо получить Part#getInputStream()
а затем скопируйте его в Path
представляя местоположение. Вы можете сделать это в методе (слушателя) действия (ajax) обычным способом. Вот пример, который делает это с слушателем ajax во время HTML DOM change
событие:
<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.file}">
<f:ajax listener="#{bean.save}" />
</h:inputFile>
</h:form>
private Part file; // +getter+setter
public void save() {
try (InputStream input = file.getInputStream()) {
Files.copy(input, new File(uploads, filename).toPath());
}
catch (IOException e) {
// Show faces message?
}
}
uploads
папка и filename
полностью под вашим контролем. Например "/path/to/uploads"
а также Part#getSubmittedFileName()
соответственно. Имейте в виду, что любой существующий файл будет перезаписан, вы можете использовать File#createTempFile()
чтобы автоматически сгенерировать имя файла.
Не использовать Part#write()
как может предложить какой-то пропел Он будет в основном переименовывать файл во временное хранилище, как указано @MultipartConfig(location)
, Также не используйте ExternalContext#getRealPath()
чтобы сохранить загруженный файл в папке развертывания. Файл будет утерян при повторном развертывании WAR по той простой причине, что файл не содержится в исходной WAR. Всегда сохраняйте его по абсолютному пути вне папки развертывания.
Для живого демо, проверьте последний пункт <o:graphicImage>
демо на витрине OmniFaces.