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

Я загружаю файл в JSF. Я использую Tomahawk для этого, но тот же вопрос применим, например, для PrimeFaces

и JSF 2.2 .

У меня есть следующий код компонента:

 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(); } 

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

Метод 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, который вы уже должны иметь в своем пути к classам, поскольку это зависимость от компонента загрузки файлов 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 с использованием тега или .

PrimeFaces использует два декодера для загрузки файлов для загрузки содержимого p: fileupload

  1. NativeFileUploadDecoder
  2. CommonsFileUploadDecoder

NativeFileUploadDecoder – это дешифратор загрузки по умолчанию, и для него требуется контейнер сервлетов 3.0. Поэтому, если ваш контейнер сервлетов меньше 3, он не будет работать с вами. Также некоторые серверы приложений ограничивают использование многочастного контента

Поэтому, если у вас есть проблема с собственным декодером загрузки по любой причине, вам придется использовать другой декодер, который является «CommonsFileUploadDecoder»,

CommonsFileUploadDecoder зависит от общей библиотеки Apache, поэтому вам нужно помещать файлы commons-fileupload и commons-io в свой class-путь, версия зависит от версии ваших перфолей, но для меня работают 1.3 и 2.2.

для использования CommonsFileUploadDecoder вы должны использовать фильтр

  PrimeFaces FileUpload Filter org.primefaces.webapp.filter.FileUploadFilter   PrimeFaces FileUpload Filter Faces Servlet  

подождите, пока фильтр не будет работать, потому что внутри фильтра он проверяет загрузчик, если он не предоставлен, и обнаруживает хотя бы JSF 2.2, поэтому он обходит запрос декодеру по умолчанию «Родной», а затем он не будет работать для вашего

чтобы заставить фильтр использовать общий декодер, вы должны поместить следующий параметр контекста в свой web.xml

  primefaces.UPLOADER commons  
  • найти разницу между двумя текстовыми файлами с одним элементом на строку
  • Как писать и читать java-сериализованные объекты в файл
  • Как проверить файл, если он существует с шаблоном в Java?
  • Стандартный сжатый способ копирования файла на Java?
  • ReadAllLines для объекта Stream?
  • Элегантный способ чтения файла в массив byte в Java
  • Копия файла изображения, используется другим процессом
  • Переименуйте файл в C #
  • Как получить все файлы под определенным каталогом в MATLAB?
  • Android; Проверьте, существует ли файл без создания нового
  • Найдите строку в файле и удалите ее
  • Давайте будем гением компьютера.