Но большая проблема в том, что этот список содержит только один файл закачанных. Как я могу взять каждый файл, загруженный с UploadedFile
событие?
Это не может быть воспроизведено с минимальным примером с наименьшими возможными зависимостями/ресурсами, если вы явно не укажете с минимальным воспроизводимым примером.
Создайте класс утилиты следующим образом (класс полностью зависит от требования).
public class FileUtil implements Serializable {
private InputStream inputStream; // One can also use byte[] or something else.
private String fileName;
private static final long serialVersionUID = 1L;
public FileUtil() {}
// Overloaded constructor(s) + getters + setters + hashcode() + equals() + toString().
}
Управляемая боб получать несколько файлов:
@Named
@ViewScoped
public class TestBean implements Serializable {
private List<FileUtil> fileList;
private static final long serialVersionUID = 1L;
public TestBean() {}
@PostConstruct
public void init() {
fileList = new ArrayList<>();
}
public void fileUploadListener(FileUploadEvent event) throws IOException {
UploadedFile file = event.getFile();
FileUtil fileUtil = new FileUtil();
fileUtil.setInputStream(file.getInputstream());
fileUtil.setFileName(file.getFileName());
fileList.add(fileUtil);
}
// Bound to a <p:commandButton>.
public void action() {
for (FileUtil fileUtil : fileList) {
System.out.println(fileUtil.getFileName());
}
// Use the list of files here and clear the list afterwards, if needed.
fileList.clear();
}
}
XHTML файл, содержащий только <p:fileUpload>
и <p:commandButton>
только ради демонстрации.
<h:form id="form">
<p:fileUpload id="fileUpload"
mode="advanced"
fileLimit="5"
multiple="true"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
sequential="true"
process="@this"
fileUploadListener="#{testBean.fileUploadListener}">
</p:fileUpload>
<p:commandButton value="Submit"
process="@this"
update="fileUpload"
actionListener="#{testBean.action}"/>
</h:form>
Если вам нужно byte[]
вместо InputStream
, а затем просто изменить private InputStream inputStream;
в FileUtil
класса byte[]
, а затем использовать
byte[] bytes = IOUtils.toByteArray(uploadedFile.getInputstream());
извлечь байтовый массив из InputStream
(где IOUtils
является от org.apache.commons.io
. Вы также можете сделать это вручную, написав несколько строк кода).
Вы также можете построить List<UploadedFile>
без создания дополнительного класса, как FileUtil
как в этом примере, но сделать это будет санкционировать зависимость PrimeFaces на уровне услуг (что не должно произойти), если вы случайно использовать этот слой в вашем приложении , так как UploadedFile
является артефактом PrimeFaces. В конце концов, это полностью зависит от требования.
Вам нужно будет хранить 'InputStream' или' byte [] 'или даже' UploadedFile' в зависимости от необходимости извлекать из файлов, загружаемых в коллекцию или массив, то есть внутри 'fileUploadListener'. – Tiny
Я так думаю, но каждый i-элемент байтового массива - это UploadedFile? – Alex
Моя проблема в том, что я управляю именем каждого файла, загруженного с предыдущим файлом, поэтому мне нужен список имен каждого файла. – Alex