【问题标题】:PrimeFaces UploadedFile afax sizelimit from modal dialog模态对话框中的 PrimeFaces UploadedFile afax sizelimit
【发布时间】:2016-12-11 09:14:52
【问题描述】:

我需要从模式对话框中获取上传的文件。所以我设法使用带有简单非 ajax 模式的 primeFaces fileUpload 组件来做到这一点:

<p:dialog id="dlg" widgetVar="dlg" modal="true" appendTo="@(body)"
          header="#{messages['pages.dlg']}" closeOnEscape="true">
    <h:form id="dlgForm" enctype="multipart/form-data">
        <!-- Some business data -->
        <p:fileUpload value="#{bean.uploadedFile}" mode="simple"/>
        <p:commandButton id="saveBtn" action="#{bean.save}" update="messages" ajax="false"
            partialSubmit="dlgForm"/>
    </h:form>
</p:dialog>

当从 bean 调用 save 方法时,我的服务方法与业务逻辑一起运行。现在我得到了新的要求:将文件大小限制为 5 MB。但是当我尝试在fileUpload 组件上使用sizeLimit 属性时 - 我什么也没发生。原因是验证在客户端,但禁用 ajax 后无法验证。

我尝试采用advanced 模式,但遇到了几个问题:

  1. bean 上的uploadedFilerequestScoped - 所以当调用save 按钮时我无法获取数据。我只能将其保存在 fileUploadListener 中——但问题来了:我需要将另一个业务数据保存为该过程的一部分。上传的文件是用户提供的信息的一部分。我不能只调用没有这些数据的保存文件。
  2. 当按下upload 时,文件正在上传预览(如果是图像文件) - 文件上传后预览将立即消失。我如何告诉他从fileUpload 组件留在advanced 模式的底部字段?并且仅在按下save 按钮时才保存在服务器端?

所以问题是:我如何在这样的对话框中使用advanced 组件类型?我正在使用 PrimeFaces 6.0、JSF 2.2 (mojara)。

【问题讨论】:

    标签: ajax jsf primefaces


    【解决方案1】:

    我找到了解决方案,而且非常简单。我只需要将上传的文件保存在 bean 的私有字段中:

    @ManagedBean
    @ViewScoped
    public class Bean {
        @EJB
        private SomeService service;
    
        private BusinessObjectDTO objectDTO; // DTO with business data from dialog form
        private byte[] fileData;
        private String fileName;
    
        public void handleFileUpload(FileUploadEvent event) {
            UploadedFile uploadedFile = event.getFile();
            fileData = JSFHelper.getFileData(uploadedFile);
            fileName = uploadedFile.getFileName();
        }
    
        // Invoked when save is called from dialog
        public void save() {
            service.save(objectDTO, fileData, fileName);
            // add info message
        }
    }
    

    然后我可以让oncomplete 在另一个组件中显示上传的文件预览。

    【讨论】:

    • 但这 also 是一个 viewscoped bean,而不是您在问题中所说的 requestscoped bean!而且我看不到您实际上将它保存在某个地方(只有名称),除非这发生在您的 JSFHelper 中。那么最好在这个方法中包含该代码。
    • @Kukeltje Save 在按下对话框中的按钮时在save 方法上发生。 JSFHelper 仅用于从UploadedFile 实例中获取字节。
    • 对不起,我错过了一小部分,我的错。但你仍然改变了范围,不是吗?
    猜你喜欢
    • 2015-12-29
    • 2014-12-19
    • 1970-01-01
    • 2019-03-09
    • 2022-09-08
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多