Как загрузить файл, используя 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.

Смотрите также:

Другие вопросы по тегам