【问题标题】:Make sure that bean action method is invoked after file upload listener is finished确保在文件上传侦听器完成后调用 bean 操作方法
【发布时间】:2015-05-10 20:39:08
【问题描述】:

当用户使用 Primefaces fileUpload 元素上传文件时,服务器方法仅在文件上传后调用。然后我在提交表单并且文件没有完全传输到服务器时出现问题我不知道我应该在提交方法中等待多长时间。

为了在提交方法期间等待,我创建了一个线程,只要上传需要,它就会一直存在,但正如之前指出的,当用户选择文件时,不会触发方法“handleFileUpload(FileUploadEvent event)”。

public void handleFileUpload(FileUploadEvent event) {
        System.out.println("start fileupload");
        FileUploadWaiter fileUploadWaiter = new FileUploadWaiter();
        fileUploadThread = new Thread(fileUploadWaiter);
        fileUploadThread.start();
        System.out.println("fileupload triggered");
        fileType = event.getFile().getContentType();
        file = convertUploadedFileToByte(event.getFile());
        fileUploadWaiter.stop();
        try {
            fileUploadThread.join();
        } catch (InterruptedException e) {
            //
        }
        System.out.println("upload fertig");// TODO
    }

在页面上:

<h:form enctype="multipart/form-data" id="form">
...
<p:fileUpload fileUploadListener="#{eintrag.handleFileUpload}"
                                    mode="advanced" update="msgFileUpload" auto="true"
                                    sizeLimit="#{config.fileUploadMaxSize}"
                                    allowTypes="/(\.|\/)(jpeg|jpg|png)$/" label="Auswählen"
                                    disable="false" id="fileUpload" />
...
</h:form>

代码:

public void handleFileUpload(FileUploadEvent event) {
        System.out.println("start fileupload");
        FileUploadWaiter fileUploadWaiter = new FileUploadWaiter();
        fileUploadThread = new Thread(fileUploadWaiter);
        fileUploadThread.start();
        System.out.println("fileupload triggered");
        fileType = event.getFile().getContentType();
        file = convertUploadedFileToByte(event.getFile());
        fileUploadWaiter.stop();
        try {
            fileUploadThread.join();
        } catch (InterruptedException e) {
            //
        }
        System.out.println("fileupload finished");// TODO
    }

我在 Primefaces 手册中没有找到任何提示

【问题讨论】:

  • 为什么不在文件上传完成时阻止页面的其余部分/禁用组件?
  • 无论你尝试什么,都不要,nevernever 在 Java EE 应用程序中手动创建 Thread

标签: multithreading jsf file-upload primefaces


【解决方案1】:

感谢 kolossus,我在文件上传期间阻止了提交按钮

page.xhtml:

<script>
    function disableButtons() {
        $(PrimeFaces.escapeClientId('form:fileUpload_input')).prop('disabled', true);
        $(PrimeFaces.escapeClientId('form:erstellen')).prop('disabled', true);
    }

    function enableButtons() {
        if (!PF('upload').files.length) {
                $(PrimeFaces.escapeClientId('form:fileUpload_input')).prop('disabled', false);
                $(PrimeFaces.escapeClientId('form:erstellen')).prop('disabled', false);
                }
    }
</script>


<p:fileUpload fileUploadListener="#{eintrag.handleFileUpload}"
    mode="advanced" update="msgFileUpload" auto="true"
    sizeLimit="#{config.fileUploadMaxSize}"
    allowTypes="/(\.|\/)(jpeg|jpg|png)$/" label="Auswählen"
    id="fileUpload" dragDropSupport="false"
    invalidSizeMessage="Dateigröße überschritten #{config.fileUploadMaxSize}"
    onstart="disableButtons();"
    oncomplete="enableButtons();"
    widgetVar="upload" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2016-04-20
    • 2017-08-16
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多