我整天都试图让客户端在FormData()对象中使用UTF-8编码发送AJAX请求。我在服务器端使用Sping MVC,但在这种情况下不适用,因为:
我可以向服务器POST非多部分请求,我可以捕获请求并查看:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
我也可以看到编码好的字符(á,é,í,ó,ú)。
如果我使用AJAX +文件上传+ FormData进行POST,请使用以下代码:
var data = new FormData();
data.append('body', jq("#sp_body").val());
data.append('signature', jq("#sp_signature").val());
data.append('subject', jq("#sp_subject").val());
data.append('email', jq("#sp_email").val());
data.append("file", jq("#sp_file")[0].files[0]);
jq.ajax({
url: contextPath + "/jobs/" + job + "/sendmail",
data: data,
cache: false,
dataType: 'text',
processData: false,
contentType: false,
mimeType: "multipart/form-data",
type: 'POST',
success: function(result){
data = jq.parseJSON(result);
if (data["statusCode"] == "success") {
jq("#save_status").html("Email sent!").show().delay(5000).fadeOut(200);
} else {
jq("#save_status").html(data["errors"]).show().delay(5000).fadeOut(200);
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
然后我捕获了请求,我看到了:
Content-Type: multipart/form-data; boundary=---------------------------279972256522979
但标题中没有UTF-8,非拉丁字符也是乱码。
问题是,如何使用FormData进行POST(因为我想同时POST字符串和文件),设置UTF-8编码?
我读过UTF-8 text is garbled when form is posted as multipart/form-data,但这对我没有帮助。
答案 0 :(得分:0)
在servlet中,您必须再次设置编码:
public void extractRequest(HttpServletRequest request) throws Exception {
if (request != null) {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = null;
try {
items = upload.parseRequest(request);
}
catch (FileUploadException e) {
e.printStackTrace();
}
while (itr.hasNext()) {
FileItem item = itr.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString("UTF-8");
...
...
在你的HTML中:
<form id="formid" action="<yourpath>" enctype="multipart/form-data"
method="POST" accept-charset="utf-8">
当然,如果你使用的是数据库,那么也必须设置同样的东西
请告诉我这是否有帮助;否则我们可以看看其他领域。