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

时间:2014-03-28 06:02:35

标签: jsf jsf-2 primefaces

我在应用程序中使用Primefaces Multiple file upload component。在这里我选择' n'文件数量并点击上传按钮。然后我需要按照字母顺序获取fileUploadListener中的每个文件。怎么可能?

2 个答案:

答案 0 :(得分:9)

由于多文件上传组件是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>

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

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

GithubOnline Demo

enter image description here

希望这有帮助。

答案 1 :(得分:1)

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

<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