2

我正在上传图像文件,我需要它们来处理带重音的字符——所以我把所有东西都用到了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);
            }
}

有任何想法吗?

谢谢。

4

3 回答 3

1

从API 参考中可以看出,解析器使用自己的编码。

尝试:

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

该参考建议在构造函数中传递它:

mpp = new MultipartParser(request, 100000000, true, true, "UTF-8");
于 2013-04-11T19:08:26.127 回答
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

于 2013-04-11T17:34:11.693 回答
0

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

于 2013-04-11T18:39:40.507 回答