3

我有一个带有文件上传组件的表单:

<h:form id="form" enctype="multipart/form-data">
   ... 
   <h:inputFile id="file" value="#{importController.file}" label="File:"></h:inputFile>
   ...
</h:form>

和具有 Part 属性的 viewscoped 支持 bean

@Named
@ViewScoped
public class ImportController implements Serializable {
    ...
    private Part file;
    // getters and setters omitted
}

如果用户在第一次尝试时正确填写了表单中的所有内容,那么逻辑就可以正常工作。但是,如果在 POST 之后出现验证错误(即缺少某些文本字段),那么页面将再次使用已发布的数据和验证消息呈现,则表单将呈现没有enctype="multipart/form-data"属性。如果用户更正值,再次选择要上传的文件并提交表单,则会导致问题。然后抛出异常“不是多部分请求”。

我试图用 primefaces p:fileUpload 替换本机 jsf h:inputFile 但行为相似。在 primefaces 的情况下,不会引发异常,但由于缺少呈现表单的 enctype,根本不会注入支持 bean 中的 UploadedFile 属性。

我使用 javavscript 修复了这个问题,它在页面加载后强制 enctype,但这不是正确的方法。那么这是正确的行为或错误还是我错过了一些基本的东西?

表单的某些部分是使用 ajax 动态加载的,但 inputFile 组件并非如此。但是,丢失的 enctype 不是由 ajax 调用引起的,而是在 POST 后重新渲染页面时立即丢失,之后没有调用 ajax。

Wildfly 12.0.0.Final、Mojarra 2.3.3.SP1、Primefaces 6.2

4

0 回答 0