Подтвердить что ты не робот

Как сохранить загруженный файл в JSF

Я загружаю файл в JSF. Для этого я использую Tomahawk <t:inputFileUpload>, но тот же вопрос применим, например, PrimeFaces <p:fileUpload> и JSF 2.2 <h:inputFile>.

У меня есть код подкачки bean:

private UploadedFile uploadedFile; // +getter+setter

public String save() throws IOException {
    String name = uploadedFile.getName();
    System.out.println("File name: " + name);

    String type = uploadedFile.getContentType();
    System.out.println("File type: " + type);

    long size = uploadedFile.getSize();
    System.out.println("File size: " + size);  

    InputStream stream = uploadedFile.getInputStream();
    byte[] buffer = new byte[(int) size];  
    stream.read(buffer, 0, (int) size);  
    stream.close();  
}

Я могу получить имя, тип и размер файла, но я не могу сохранить этот файл по определенному пути. Я не могу найти правильный способ сохранить загруженный файл. Как я могу достичь этого?

4b9b3361

Ответ 1

Метод getInputStream() загруженного файла представляет собой содержимое файла.

InputStream input = uploadedFile.getInputStream();

Вам нужно скопировать его в файл. Сначала вы должны подготовить папку в локальной файловой системе на диске, где должны быть сохранены загруженные файлы. Например, /path/to/uploads (в Windows это будет на том же диске, что и на сервере). Обратите внимание, что вы должны абсолютно не хранить файлы в расширенной папке WAR с использованием относительного пути или getRealPath() по указанным здесь причинам Загруженное изображение доступно только после обновления страница.

Затем вам необходимо автогенерировать имя файла. В противном случае, когда кто-то другой загрузит файл по совпадению с тем же именем позже, он будет перезаписан. Вы можете использовать Files#createTempFile() для получения имени с автогенерированным именем.

Path folder = Paths.get("/path/to/uploads");
String filename = FilenameUtils.getBaseName(uploadedFile.getName()); 
String extension = FilenameUtils.getExtension(uploadedFile.getName());
Path file = Files.createTempFile(folder, filename + "-", "." + extension);

Путь к загрузке при необходимости может быть параметризован на основе одного из нескольких способов, показанных в этом Q & A: Рекомендуемый способ сохранения загруженных файлов в приложении сервлета. FilenameUtils является частью Apache Commons IO, который вы уже должны иметь в своем пути к классам, поскольку он зависит от компонента загрузки файла Tomahawk.

Наконец, просто поместите загруженный файл в этот файл (предположим, что Java 7):

try (InputStream input = uploadedFile.getInputStream()) {
    Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
}

System.out.println("Uploaded file successfully saved in " + file);

Затем, чтобы загрузить его обратно, проще всего зарегистрировать /path/to/uploads в качестве нового контекста webapp или виртуального хоста, чтобы все эти файлы были доступны по URL-адресу. См. Также Загрузка изображений извне webapps/webcontext/deploy с помощью < h: graphicImage > или <img> тег.