我有一个带有文件上传组件的表单:
<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