4

いくつかのファイルをアップロードしてから別のページにリダイレクトしようとすると、最初のファイルがアップロードされた直後にのみ機能oncomplete するという問題がありますoncomplete

<p:fileUpload  mode="advanced"
     label="#{FileMessages.file_add_file_lbl_Select_File}"
     fileUploadListener="#{fileAddFileAction.upload}"
     oncomplete="redirect(#{fileAddFileAction.groupId});"
     multiple="true"
     allowTypes="/(\.|\/)(txt|doc|docx|pdf)$/"
     widgetVar="fileUplaod" >
 </p:fileUpload>

JavaScript 関数: リダイレクト (groupId)

function redirect(groupId) {
     var url = "/network/group/files.html?gId="+groupId;
     $(location).attr('href',url);
}

bean.java

public void upload(FileUploadEvent event) {

    UploadedFile uploadedFile = event.getFile();

    try {
        String thumbnail = getDestination() + uploadedFile.getFileName();
        String[] filetype = thumbnail.split("\\.");
        String newfilename = Calendar.getInstance().getTimeInMillis() + "." + filetype[1];

        SystemFile file = new SystemFile();
        file.setAccount(getActor().getAccount());
        file.setCtime(new Date());
        file.setName(newfilename);
        file.setPath(getDestination());
        file.setFileType(FileUtil.checkFileType(filetype[1]));
        file.setOriginalName(uploadedFile.getFileName());

        getFileService().saveSystemFile(file);

        copyFile(getDestination() + newfilename, uploadedFile.getInputstream());

        copyFile(getDestination() + newfilename, uploadedFile.getInputstream());

    } catch (IOException ex) {
        Logger.getLogger(FileAddFileAction.class.getName()).log(Level.SEVERE, null, ex);
    }
}
4

2 に答える 2

0

同様の問題がありました(Primefaces 5)。「親は ClientBehaviorHolder のインスタンスではありません」というエラーが原因で、ajax fileUploadsComplete の追加に失敗しました。

これが私のハックアラウンドです。それは最も満足のいくものではありませんが、機能しています:

<script>
    function setUploadFilesCount() {
        var numberOfFiles = $('.ui-fileupload-preview').size();
        var input = document.getElementById('fileupload-multi-fix-input');
        input.value = numberOfFiles;
        input.onchange();
    }
</script>

<h:form id="file-upload-form">
    <p:fileUpload id="file-upload" fileUploadListener="#{backingBean.handleFilesUpload}" mode="advanced" dragDropSupport="false"
                               sizeLimit="10000000" multiple="true" allowTypes="/(\.|\/)(jpg)$/" onstart="setUploadFilesCount()" update=":content">
    </p:fileUpload>
</h:form>

<h:form prependId="false" style="display:none;">
    <h:inputText id="fileupload-multi-fix-input" value="#{backingBean.numberOfUploadFiles}">
        <f:ajax event="change" execute="@form"  />
    </h:inputText>
</h:form>

したがって、BackingBean には次のものがあります。

@Named
@SessionScoped
public class BackingBean implements Serializable{

    private static final long serialVersionUID = 1L;

    private int numberOfUploadFiles; //... add getter and setter

    private boolean isUploadComplete = false; //... add getter and setter

    private int uploadCount = 0;

    public void handleFilesUpload(FileUploadEvent event) throws IOException {

        // ... handle file upload here

        uploadCount++;

        if(uploadCount == numberOfUploadFiles){
            isUploadComplete = true;
        }
    }
}

説明:

JavaScript 関数 setUploadFilesCountと、<h:form />hidden を含む2 番目の関数を追加しました<h:input />

<p:fileUpload onstart=...(最初の) ファイル転送の開始時に 1 回呼び出されます。setUploadFilesCountJavaScript 関数を呼び出してonstart、バッキング Bean にアップロード ファイルの数を設定します。

ファイルの数は、要素の出現回数を css クラスで読み取ることによって検出されますui-fileupload-preview。ビュー内のui-fileupload-preview要素の数は、アップロード ファイルの数と同じです。これは

$('.ui-fileupload-preview').size();

input.onchange();非表示の入力フィールド値がバッキング Bean に送信されます。

バッキング Bean では、カウンターをインクリメントすることで最後のアイテムがアップロードされたかどうかを確認できます

uploadCount++;

if(uploadCount == numberOfUploadFiles){...}

そのため、すべてのアイテムがアップロードされたかどうかを確認するか、最後のアップロード アイテムが終了した後に特別な関数を呼び出すことができます。


<p:fileUpload oncomplete...アップロード ファイルの 1 つがアップロードされるたびに呼び出されます。

したがって、特定のケースでは、JavaScriptを次のように追加でラップする必要があります。

<h:panelGroup id="afterLoad">
    <h:outputScript>
        function redirect(groupId) {
            if(#{backingBean.isUploadComplete}=='true'){
                var url = "/network/group/files.html?gId="+groupId;
                $(location).attr('href',url);
            }
        }
    </h:outputScript>
</h:panelGroup>

と同じ形にして<p:fileUpload追加<p:fileUpload ... update="afterLoad" ...

于 2014-08-12T17:25:46.763 に答える
0

既知の問題のようです: http://code.google.com/p/primefaces/issues/detail?id=3836

カスタム パッチは、このページのユーザーによって実行されました:

ap:fileUpload タグ内に次の行を追加することで使用できます。

<p:ajax event="fileUploadsComplete" listener="#{filesBean.done}"/>

filesBean.done メソッドは次のようになります。

public void done(FileUploadsCompleteEvent event) {
    System.out.println("done"); 
}
于 2013-04-09T21:20:10.740 に答える