使用xhr上传文件时,在何处以及如何设置正确的编码

时间:2013-04-11 17:29:30

标签: javascript encoding utf-8 multipartform-data

我正在上传图片文件,我需要他们使用重音字符 - 所以我已经使用UTF-8

我使用这个javascript函数上传它们:

     $('#files').change(function(e) {
            var formData = new FormData();
            for (var i=0; i<this.files.length;i++){
                formData.append(this.files[i].name, this.files[i]);
            }
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(e) {
                if ( 4 == this.readyState ) {
                    showMessage("Uploaded.");
                }
            };
            xhr.open('post', 'accoms/upload.jsp', true);
            xhr.send(formData);
        }, false);

因此,如果我有一个名为“Björk.jpg”的文件,当我查看使用FireFox Firebug发送到服务器的内容时​​,它显示为:

Content-Disposition: form-data; name="Björk.jpg"; filename="Björk.jpg"

这似乎是服务器收到的内容。

帖子的编码显示如下:

Content-Type    text/html;charset=UTF-8

当我以其他形式发送常规表单数据输入文本时,它会发送,并且服务器会正​​确接收单词“Björk”。

以下是服务器端代码:

mpp=new MultipartParser(request, 100000000);
com.oreilly.servlet.multipart.Part part;
FilePart fp=null;
String fileName="";
files=new ArrayList();
while((part=mpp.readNextPart())!=null){
    if (part.isFile()){
        fp=(FilePart)part;
        fileName=fp.getFileName();
        File file=new File(fileName);
        long size=fp.writeTo(file);
                    files.add(file);
            }
}

有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:1)

解析器使用自己的编码,如API reference中所示。

尝试:

mpp = new MultipartParser(request, 100000000);
mpp.setEncoding("UTF-8");
//rest of your code

引用建议在构造函数中传递它:

mpp = new MultipartParser(request, 100000000, true, true, "UTF-8");

答案 1 :(得分:0)

您可以像这样设置编码

var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
// retrieve data unprocessed as a binary string
oReq.overrideMimeType("text/plain; charset=x-user-defined");

可在此处找到更多信息 https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest

答案 2 :(得分:0)

问题很可能出在服务器端代码中。也许您没有考虑到文件名是UTF-8编码的。您在问题中发布的任何内容都表明该名称发送错误。您在Firebug中看到的并不一定是发送的内容。 Firebug在检查请求时使用的默认编码很可能与浏览器使用的编码不匹配。这可以解释为什么文件名在Firebug中看起来乱码。