使用AJAX +多部分表单数据+ UTF-8编码发送文件和文本

时间:2014-02-25 20:56:41

标签: ajax encoding utf-8

我整天都试图让客户端在FormData()对象中使用UTF-8编码发送AJAX请求。我在服务器端使用Sping MVC,但在这种情况下不适用,因为:

  1. 我可以向服务器POST非多部分请求,我可以捕获请求并查看:

    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    

    我也可以看到编码好的字符(á,é,í,ó,ú)。

  2. 如果我使用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,非拉丁字符也是乱码。

  3. 问题是,如何使用FormData进行POST(因为我想同时POST字符串和文件),设置UTF-8编码?

    我读过UTF-8 text is garbled when form is posted as multipart/form-data,但这对我没有帮助。

1 个答案:

答案 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">

当然,如果你使用的是数据库,那么也必须设置同样的东西

请告诉我这是否有帮助;否则我们可以看看其他领域。