我正在将文件上传到服务器。文件上载HTML表单有两个字段:
提交表单后,将正确接收文件内容。但是,当读取文件名(上面的第1点)时,它会出现乱码。 ASCII字符正确显示。如果用其他语言(德语,法语等)给出名称,则存在问题。
在servlet方法中,请求的字符编码设置为UTF-8。我甚至尝试过如上所述的过滤器 - How can I make this code to submit a UTF-8 form textarea with jQuery/Ajax work? - 但它似乎不起作用。只有文件名似乎是乱码。
文件名所在的MySQL表支持UTF-8。我给了随机的非英文字符&它们存储/显示正确。
使用Fiddler,我监控了请求&所有POST数据都正确传递。我正在尝试确定数据如何/在哪里出现乱码。任何帮助将不胜感激。
答案 0 :(得分:53)
我使用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");
希望有所帮助
编辑:从Java 8开始,您还可以使用以下内容:
new String (s.getBytes (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
答案 1 :(得分:26)
只需使用Apache commons上传库。
将URIEncoding="UTF-8"
添加到Tomcat的连接器,并使用FileItem.getString(“UTF-8”)而不是FileItem.getString()而不指定charset。
希望得到这个帮助。
答案 2 :(得分:18)
我遇到了这个问题,发现这是调用
的顺序request.setCharacterEncoding("UTF-8");
导致了这个问题。它必须在对request.getParameter()的所有调用之前调用,所以我在我的过滤器链的顶部使用了一个特殊的过滤器。
http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored
答案 3 :(得分:11)
我遇到了同样的问题,结果发现除了在Filter中指定编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
有必要在表单中添加“acceptcharset”
<form method="post" enctype="multipart/form-data" acceptcharset="UTF-8" >
和使用
运行JVM-Dfile.encoding=UTF-8
如果使用response.setCharacterEncoding()在HTTP标头中发送HTML元标记,则无需使用HTML元标记。
答案 4 :(得分: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'
}
答案 5 :(得分:3)
我正在使用org.apache.commons.fileupload.servlet.ServletFileUpload.ServletFileUpload(FileItemFactory)
并在读出参数值时定义编码:
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
String fieldName = item.getFieldName();
if (item.isFormField()) {
String fieldValue = item.getString("UTF-8"); // <-- HERE
答案 6 :(得分:2)
过滤器是IE的关键。还有其他一些要检查的事情;
页面编码和字符集是什么?两者都应该是UTF-8
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
元标记中的字符集是什么?
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
你的MySQL连接字符串是否指定了UTF-8? e.g。
jdbc:mysql://127.0.0.1/dbname?requireSSL=false&useUnicode=true&characterEncoding=UTF-8
答案 7 :(得分:1)
我正在使用带有glassfish和SQL Server的Primefaces。
在我的情况下,我在后端创建了Webfilter来获取每个请求并转换为UTF-8,如下所示:
package br.com.teste.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter(servletNames={"Faces Servlet"})
public class Filter implements javax.servlet.Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
在视图(.xhtml)中,我需要将enctype paremeter的表单设置为UTF-8,如@Kevin Rahe:
<h:form id="frmt" enctype="multipart/form-data;charset=UTF-8" >
<!-- your code here -->
</h:form>
答案 8 :(得分:0)
过滤器和设置Tomcat以支持UTF-8 URI仅在您通过URL的查询字符串传递时非常重要,就像使用HTTP GET一样。如果您正在使用POST,并在HTTP消息的正文中使用查询字符串,那么重要的是请求的内容类型,这将由浏览器将内容类型设置为UTF-8和发送带有该编码的内容。
真正做到这一点的唯一方法是告诉浏览器你只能通过在每个响应上设置Accept-Charset标头来接受UTF-8“UTF-8; q = 1,ISO-8859-1; q = 0.6" 。这将把UTF-8作为最好的质量和默认的字符集,ISO-8859-1,可接受,但质量较低。
当你说文件名是乱码时,它是否在HttpServletRequest.getParameter的返回值中出现乱码?
答案 9 :(得分:0)
我遇到了同样的问题。对我有用的唯一解决方案是添加&lt; property =“defaultEncoding”value =“UTF-8”&gt;到spring配置文件中的multipartResoler。
答案 10 :(得分:0)
还必须确保将web.xml中的编码过滤器(org.springframework.web.filter.CharacterEncodingFilter)映射到多部分过滤器(org.springframework.web.multipart.support.MultipartFilter)之前。
答案 11 :(得分:0)
我想我参加聚会很晚,但是当您使用wildfly时,可以将默认编码添加到standalone.xml中。 只需在standalone.xml中搜索
MyEnum.valueOf("A")
并添加这样的编码:
<servlet-container name="default">
答案 12 :(得分:0)
为避免将所有请求参数手动转换为UTF-8,可以在控制器中定义一个用@InitBinder
注释的方法:
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new CharacterEditor(true) {
@Override
public void setAsText(String text) throws IllegalArgumentException {
String properText = new String(text.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
setValue(properText);
}
});
}
上面的代码将在定义它的控制器中将所有请求参数自动转换为UTF-8。
答案 13 :(得分:-1)
您不使用UTF-8编码HTML表单的文本数据。 html标准定义了两种编码,the relevant part of that standard is here。与句柄ascii相比,“旧”编码是application / x-www-form-urlencoded。新的,正常工作,是multipart / form-data。
具体来说,表单声明如下所示:
<FORM action="http://server.com/cgi/handle"
enctype="multipart/form-data"
method="post">
<P>
What is your name? <INPUT type="text" name="submit-name"><BR>
What files are you sending? <INPUT type="file" name="files"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
我认为你需要担心的是 - 网络服务器应该处理它。如果您正在编写直接从Web客户端读取InputStream的内容,则需要阅读RFC 2045和RFC 2046。