如何从标有enctype的表单中提取文本:multipart / form-data(JSF 2.0)

我有一个JSF页面啊:表单有一些文本字段,还有一个来自primefaces的imageupload小工具

我的问题是:如何从字段中获取文本并将其分配给某个变量。(目标是将上传的图像与文本分开)

-我该怎么办?

– 那我需要一个filter吗?

– 使用primefaces fileupload工具有没有简单的方法来实现它?

这对于PrimeFaces 2.2.1来说并非无足轻重。 PF 2文件上传处理有点像史诗般的失败。 在幕后,使用Ajax上传文件已经不是一件容易的事了。 XMLHttpRequest对象根本不支持multipart/form-data请求。 许多“Ajaxified”(具有异步进展的感觉)文件上传解决方案基于隐藏的iframe或-as在PF-使用Flash的情况下。 PF 2一个基于Flash,并且这不能与常规文本输入组合,以便一次性提交所有数据。

在PF 3中,文件上传组件已经过大幅修改 。 使用“简单”文件上传模式,您的问题应该得到解决。 然而,PF 3目前仍处于beta / alpha阶段。 您需要在您的webapp上进行大量的unit testing,看看它是否在PF 3上没有中断。

如果PF 3不是一个选项,那么你最好的选择是使用Tomahawk 2.0或自制一个JSF组件。

  • JSF 2.0文件上传 – Tomahawk 2.0文件上传教程
  • 使用JSF 2.0和Servlet 3.0上传文件 – 自定义文件上传组件教程

至于filter, FacesServlet使用HttpServletRequest#getParameter()来检索提交的值。 当您熟悉基本的JSP / Servlet时 ,您应该知道它通常如何工作。 默认的HTML表单编码是application/x-www-form-urlencodedgetParameter()方法依赖于此。 但是,为了能够沿此传输二进制数据,例如文件上载,此默认表单编码不适合 。 对于这个multipart/form-data应该使用。

但是,使用此表单编码, getParameter()调用将不再起作用。 它们都将返回null 。 在最简单的forms中,您需要基于每个请求手动解析请求主体。 另请参见如何使用JSP / Servlet将文件上载到服务器? 但是,这不能与JSF结合使用,因为它依赖于getParameter()调用以便使用提交的值设置bean属性(模型值)并调用命令按钮/链接操作。

因此,您希望以这种方式更改HttpServletRequest ,以便getParameter()调用返回正确的值。 为此, Filter是正确的选择,因为它任何servlet(如FacesServlet 之前运行。 然后,filter应该解析multipart/form-data请求体,创建一个参数映射并用自定义实现包装和替换原始HttpServletRequest ,该实现返回正确的参数并通过链传递该请求对象,以便JSF可以完全使用它透明地“通常的方式”。