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

#1 楼

由于多文件上传组件是jQuery-File-Upload插件,因此默认状态不是连续的,这意味着所有文件都是异步上传的。

要使组件进行顺序上传,您可以必须将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>


所以在这种情况下,您的文件将按字母顺序上传。

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

Github,在线演示



希望有帮助。

评论


我尝试执行此操作,但它确实有效(涉及执行顺序请求时),但最终结果导致仅实际上传了一个文件(由fileUploadListener处理)。您对所有的fileUploadListeners调用有什么建议吗?

– Nuno
15年8月27日在14:53

另外,似乎这正在转变为功能github.com/primefaces/primefaces/issues/403

– Nuno
15年8月27日在14:57

@nuno我没有完全了解你。我发布的答案已经过多次上传的测试,对于监听器被调用的每个文件,也许还有其他不适用于您?

– Hatem Alimam
15年8月27日在14:58

也许这是无关的问题-我会进一步检查

– Nuno
15年8月27日在15:00

答案现在可能会帮助您更多。注意:我正在使用JSF 2.1进行测试,但是我不认为这是您遇到的问题...检查在线演示@nuno

– Hatem Alimam
15年8月27日在15:15



#2 楼

是的,但是这种解决方案不是很好:

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

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


attachmentBean.onUpload将每个文件存储在List / Map / SortedMap中
attachmentBean.processAttachments最终对List / Map和按顺序排列的过程附件

attachmentBean必须至少为@ViewScoped