当表单作为multipart/form-data发布时,UTF-8文本会出现乱码

53 java java-ee

我正在将文件上传到服务器.文件上载HTML表单有2个字段:

  1. 文件名 - 一个HTML文本框,用户可以使用任何语言提供名称.
  2. 文件上传 - 一个HTMl'文件',用户可以在其中指定要上载的磁盘文件.

提交表单时,将正确接收文件内容.但是,当读取文件名(上面的第1点)时,它会出现乱码.ASCII字符正确显示.如果用其他语言(德语,法语等)给出名称,则存在问题.

在servlet方法中,请求的字符编码设置为UTF-8.我甚至尝试过如上所述的过滤器 - 如何让这段代码提交一个带有jQuery/Ajax工作的UTF-8表单textarea? - 但它似乎不起作用.只有文件名似乎是乱码.

文件名所在的MySQL表支持UTF-8.我给了随机的非英文字符,它们被正确存储/显示.

使用Fiddler,我监视请求并正确传递所有POST数据.我正在尝试确定数据如何/在哪里出现乱码.任何帮助将不胜感激.

Phi*_*ger 57

我使用Apache commons-fileupload遇到了同样的问题.我没有找到导致问题的原因,特别是因为我在以下地方有UTF-8编码:1.HTML元标记2.表单accept-charset属性3. Tomcat过滤每个设置"UTF-8"的请求编码

- >我的解决方案是将字符串从ISO-8859-1(或者你的平台的默认编码)转换为UTF-8:

new String (s.getBytes ("iso-8859-1"), "UTF-8");
Run Code Online (Sandbox Code Playgroud)

希望有所帮助

编辑:从Java 8开始,您还可以使用以下内容:

new String (s.getBytes (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用`new String(s.getBytes(Charset.defaultCharset()),“ UTF-8”)` (2认同)

nau*_*svn 27

只需使用Apache commons上传库.添加URIEncoding="UTF-8"到Tomcat的连接器,并使用FileItem.getString("UTF-8")而不是FileItem.getString()而不指定charset.

希望这有帮助.

  • 这应该是upvoted,没有其他解决问题...甚至尝试过滤器和域/容器xml文件等..做getString("UTF-8")解决即使其他一切都没有完成... (4认同)
  • FileItem.getString("UTF-8") 是我的解决方案 (2认同)

Rog*_*ays 19

我遇到了这个问题,发现这是调用的顺序

request.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

这导致了问题.它必须在对request.getParameter()的所有调用之前调用,所以我在我的过滤器链的顶部使用了一个特殊的过滤器.

http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored


Dan*_*Dan 13

我遇到了同样的问题,结果发现除了在Filter中指定编码之外

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

有必要在表单中添加"acceptcharset"

<form method="post" enctype="multipart/form-data" acceptcharset="UTF-8" > 
Run Code Online (Sandbox Code Playgroud)

并且运行在JVM

-Dfile.encoding=UTF-8
Run Code Online (Sandbox Code Playgroud)

如果使用response.setCharacterEncoding()在HTTP标头中发送它,则不需要HTML元标记.

  • 我正在使用Glassfish 3.1.1,并且在运行带有`-Dfile.encoding = UTF-8`的JVM时,我不需要过滤器.**但是**,只需将`acceptcharset`属性添加到`<form />`标签中,就无法解决问题.相反,我必须将charset标识符添加到`enctype`属性中,如:`<form enctype ="multipart/form-data; charset = UTF-8">`. (4认同)
  • -Dfile.encoding = UTF-8参数很重要. (2认同)

小智 7

如果有人在使用Grails(或纯Spring)Web应用程序时偶然发现了这个问题,这里的帖子对我有帮助:

http://forum.spring.io/forum/spring-projects/web/2491-solved-character-encoding-and-multipart-forms

要为多部分请求将默认编码设置为UTF-8(而不是ISO-8859-1),我在resources.groovy(Spring DSL)中添加了以下代码:

multipartResolver(ContentLengthAwareCommonsMultipartResolver) {
    defaultEncoding = 'UTF-8'
}
Run Code Online (Sandbox Code Playgroud)

  • 在[Spring上下文中的另一个问题](http://stackoverflow.com/questions/9055025/how-to-change-the-character-encoding-for-servlet-3-0-spring-mvc-multipart-upload) ,他们提到`MultipartResolver`有一个ISO-8859-1的默认解码字符集.请参阅此处的官方Spring文档:[CommonsFileUploadSupport #setDefaultEncoding](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/commons/CommonsFileUploadSupport.html#setDefaultEncoding-java. lang.String-). (3认同)