大家好,我在PrimeFaces/Jsf2 中上传更多文件有问题
我明白了http://www.primefaces.org/showcase/ui/file/upload/multiple.xhtml
当方法拦截相关事件时,我设置
UploadedFile fileUpload=event.getFile();
我想扫描与列表实现上传的每个文件
InputStream input;
input = event.getFile().getInputstream();
pojo.setFileInputStream(input);
input.close();
fileTableList.add(pojo);
但最大的问题是这个列表只包含一个上传的文件。如何获取从UploadedFile事件上传的每个文件?
怎么了?感谢您的回答
但最大的问题是这个列表只包含一个文件已上载。如何获取从
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().
}
托管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();
}
}
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
,那么只需将FileUtil
类中的private InputStream inputStream;
更改为byte[]
,然后使用
byte[] bytes = IOUtils.toByteArray(uploadedFile.getInputstream());
从InputStream
中提取一个字节数组(其中IOUtils
来自org.apache.commons.io
。您也可以通过编写几行代码手动完成)。
您也可以在不创建像本例中的FileUtil
这样的附加类的情况下构造List<UploadedFile>
,但如果您碰巧在应用程序中使用了服务层,那么这样做将强制PrimeFaces依赖于服务层(这不应该发生),因为UploadedFile
是PrimeFace工件。毕竟,这完全取决于需求。