Jsf Primefaces-在多文件上载组件中按字母顺序获取文件

Jsf Primefaces-在多文件上载组件中按字母顺序获取文件,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在应用程序中使用。在这里,我选择“n”个文件,然后单击“上载”按钮。然后我需要按照字母顺序获取fileUploadListener中的每个文件。怎么可能呢?是的,但是这个解决方案不是很优雅: <p:remoteCommand action="#{attachmentBean.processAttachments}" name="processAttachments" update="attachmentTable"/> <p:fileUpload fileU

我正在应用程序中使用。在这里,我选择“n”个文件,然后单击“上载”按钮。然后我需要按照字母顺序获取
fileUploadListener
中的每个文件。怎么可能呢?

是的,但是这个解决方案不是很优雅:

<p:remoteCommand action="#{attachmentBean.processAttachments}" 
    name="processAttachments" update="attachmentTable"/>  

<p:fileUpload fileUploadListener="#{attachmentBean.onUpload}" 
    oncomplete="processAttachments()" />

attachmentBean.onUpload
将每个文件存储在列表/Map/SortedMap中
attachmentBean.processAttachments
最终会按顺序对列表/映射和流程附件进行排序


attachmentBean
必须至少是
@viewscope

由于多文件上载组件是一个插件,默认状态不是顺序的,这意味着所有文件都是异步上载的

要让组件执行顺序上传,您必须将
sequentialUploads
设置为true,并在更改时对当前文件进行一些字母排序。所有这些都是通过javascript完成的

假设您的widgetVar是
fileUploadWV

<p:fileUpload widgetVar="fileUploadWV"
              fileUploadListener="#{attachmentBean.onUpload}" />

<script>
   $(function() {
      // setTimeout waits till the widgetVar is ready!
      setTimeout(sortFileUpload, 2000);
   });

   function sortFileUpload() {
      //Set this option to true to issue all file upload requests in a sequential order instead of simultaneous requests.  
      PF('fileUploadWV').jq.data().blueimpFileupload.options.sequentialUploads = true;

      //every time a new file is added, sort the files based on name
      PF('fileUploadWV').jq.change(function() {
          PF('fileUploadWV').files.sort(function fileSort(a, b) {
           return a.name.localeCompare(b.name)
          })
      });
   }
</script>

$(函数(){
//setTimeout等待widgetVar准备就绪!
setTimeout(sortFileUpload,2000年);
});
函数sortFileUpload(){
//将此选项设置为true以按顺序发出所有文件上载请求,而不是同时发出请求。
PF('fileUploadWV').jq.data().blueimpFileupload.options.sequentialUploads=true;
//每次添加新文件时,根据文件名对文件进行排序
PF('fileUploadWV').jq.change(function(){
PF('fileUploadWV').files.sort(函数fileSort(a,b){
返回a.name.localeCompare(b.name)
})
});
}
因此,在这种情况下,您的文件将按字母顺序上传

注意:如果不将sequentialUploads设置为true,则无法控制首先发送哪个文件

,


希望这能有所帮助。

我尝试过这样做,但效果很好(在执行顺序请求时),但最终结果是只有一个文件被实际上载(由
文件上载侦听器处理)。你有什么建议让所有的
fileUploadListener
s被调用吗?而且,这似乎正在变成一个功能@nuno我没有完全理解你。我发布的答案经过多次上传测试,对于每个调用侦听器的文件,可能有其他东西不适合你?可能这是一个无关的问题-我会进一步检查答案,现在可能会对你有更多帮助。注意:我正在使用JSF2.1进行测试,但我不认为这会是您遇到的问题。。。查看在线演示@nuno