primefaces5 jsf2多次上传e扫描元素
大家好,我在PrimeFaces/Jsf2中上传更多文件时遇到问题 我明白了 当方法截获我设置的关联事件时 UploadedFile fileUpload=event.getFile() 我想扫描每一个文件上传与清单的实施primefaces5 jsf2多次上传e扫描元素,jsf,file-upload,jsf-2,primefaces,multi-upload,Jsf,File Upload,Jsf 2,Primefaces,Multi Upload,大家好,我在PrimeFaces/Jsf2中上传更多文件时遇到问题 我明白了 当方法截获我设置的关联事件时 UploadedFile fileUpload=event.getFile() 我想扫描每一个文件上传与清单的实施 InputStream input; input = event.getFile().getInputstream(); pojo.setFileInputStream(input); input.close(); fileTableL
InputStream input;
input = event.getFile().getInputstream();
pojo.setFileInputStream(input);
input.close();
fileTableList.add(pojo);
但最大的问题是这个列表只包含一个上传的文件。
如何获取UploadedFile事件中上载的每个文件
怎么了?
谢谢你的回答
但最大的问题是这个列表只包含一个文件
上传。如何获取从UploadedFile
事件
除非您使用最小可再现示例明确说明,否则不能使用最小可能依赖项/资源的最小示例再现
创建如下所示的实用程序类(该类完全依赖于需求) 接收多个文件的托管bean:
@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();
}
}
要从InputStream
提取字节数组(其中IOUtils
来自org.apache.commons.io
。您也可以通过编写几行代码手动执行)
您也可以构建一个
列表
,而无需像本例中那样创建一个额外的类,如FileUtil
,但如果您碰巧在应用程序中使用了服务层,那么这样做会强制要求服务层上存在PrimeFaces依赖关系(这是不应该发生的),因为UploadedFile
是PrimeFaces工件。毕竟,这完全取决于需求。您需要存储InputStream
或byte[]
或甚至UploadedFile
取决于从上传到集合或数组的文件中提取的需要,即文件上传侦听器内部。我认为是这样,但字节数组的每个i元素都是上传文件?我的问题是,我控制与上一个文件一起上传的每个文件的名称,所以我想要一个每个文件的名称。集合的类型取决于要求。它可以是InputStream
,byte[]
,甚至是UploadedFile
或其他东西。可以使用uploadedFile.getFileName()
获得文件名。因此,您需要根据需要决定将哪种类型的信息存储到集合中。您可能只需要byte[]
和文件名,InputStream
和文件名或整个UploadedFile
对象……是的,可以使用UploadedFile.getFileName()获取文件名,但如何将每个文件名存储在列表中?这个方法使用递归同时显示所有的文件名。感谢Tiny,问题是我不能对每个文件名执行控制操作,因为只有一个istance包含所有的文件名;我也想到了byte[],但我的应用程序留在云系统上,无法在物理内存上写入。我没有得到术语“控制操作”。文件名的顺序控制。。我想迭代名称文件的列表。FileUtil列表不会在每个文件名中迭代我不知道该如何解释。它会对上传的每个文件重复指令。如果在上传4个文件后启动System.out.println(fileUtil.getFileName()),输出为:element1->element1 element2->element1 element2 element3->element1 element2 element3->element2 element3 element4;如果我启动一个超出列表大小的系统,输出是:1->2->3->4。它使用(我认为)递归或类似的方法。
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().
}
<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[] bytes = IOUtils.toByteArray(uploadedFile.getInputstream());