Jsf 2.2 上传与 Apache Commons 上传中的文件名字符编码

Filename characters encoding in Jsf 2.2 Upload vs. Apache Commons Upload

Wildfly 8、Omnifaces 2.2、Primefaces 5.2、JSF 2.2.11 (Mojarra)

我正在使用 Ominifaces CharacterEncodingFilter 来确保文件名在服务器上正确编码。奇怪的是,如果 Primefaces 使用 Jsf 内部上传,文件名不会被编码。如果 Primefaces 使用带有 Appache Commons 的旧方法,则可以。

示例:'Hällo.jpg' 变为 'Hällo.jpg'

Web.xml 配置: Apache 解决方案(正确):

<filter>
         <filter-name>PrimeFaces FileUpload Filter</filter-name>
         <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
   </filter>
   <filter-mapping>
         <filter-name>PrimeFaces FileUpload Filter</filter-name>
         <servlet-name>Faces Servlet</servlet-name>
   </filter-mapping>
   <context-param>
         <param-name>primefaces.UPLOADER</param-name>
         <param-value>commons</param-value>
   </context-param>

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.omnifaces.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Jsf上传(字符未编码)。其他参数被删除。

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.omnifaces.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

编辑:由于回答这是一个服务器错误。我已尝试配置服务器:

<jboss-web>
 <default-encoding>UTF-8</default-encoding>
</jboss-web>

<servlet-container name="default" default-encoding="UTF-8">

但没有用。

我转载了,WildFly根本没有考虑multipart/form-data请求的请求体编码。你真的必须在服务器端配置它(就像你对 GET 请求所做的那样)。

打开 /standalone/configuration/standalone.xml,查看以下行

<servlet-container name="default">

改为

<servlet-container name="default" default-encoding="UTF-8">

然后重启。这至少对我在 WildFly 10.0.0 上有用。我创建了问题 WFLY-6226 让它首先考虑请求主体编码,因此无需编辑 standalone.xml

在 WildFly 8.x(我测试了 8.2.1)中,不幸的是,这仍然无法工作,因为它根本没有考虑上述设置。您最好的选择是继续使用 Apache Commons FileUpload,直到您可以升级 WildFly。

如果你真的想保留原生上传,那么你可以考虑使用 ISO-8859-1 将损坏的文件名显式解码为字节,然后使用 UTF-8 重新编码。

String fileName = new String(uploadedFile.getFileName().getBytes("ISO-8859-1"), "UTF-8");

然而,这很脆弱且不可移植,因为当部署到没有出现此编码问题的服务器时,它会损坏。所以你真的需要记住在 upgrading/migrating.

时恢复解决方法