primefaces5 jsf2多次上传e扫描元素

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

大家好,我在PrimeFaces/Jsf2中上传更多文件时遇到问题

我明白了

当方法截获我设置的关联事件时

UploadedFile fileUpload=event.getFile()

我想扫描每一个文件上传与清单的实施

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