XmlHttpRequest overrideMimeType用于传出数据

时间:2011-03-02 09:02:55

标签: javascript ajax xmlhttprequest

我希望XmlHttpRequest不要触摸(即转换为UTF-8或任何其他编码)它向服务器发送和从服务器接收的任何字符。

对于从服务器收到的字符,我知道我可以XmlHttpRequest#overrideMimeType('text/plain; charset=x-user-defined')并且字符保持不变。

但是,对于通过XmlHttpRequest#send电话发送到服务器的字符,我找不到告诉XmlHttpRequest不要触摸这些字符的方法。无论我尝试什么,我都会看到XmlHttpRequest将它们编码为UTF-8。有办法防止这种情况吗?

2 个答案:

答案 0 :(得分:2)

我遇到类似的问题,上传从麦克风抓取的音频(通过闪光灯)。 这是我如何解决它(在FF 9和铬15中测试)。以下js代码将二进制输入作为字符串,并将其上载到服务器而不进行任何更改/编码。 希望这对某人有用。

    var audioBytes = <the data you want sent untouched>
    var crlf = '\r\n';
    var body = '';
    var doubleDash = '--';
    var boundary = '12345678901234567890';

    var file = {
            name: "online-recording.wav",
            type: "audio/x-wav",
            size: audioBytes.length,
            recordedContent: audioBytes
    };

    var body = doubleDash + boundary + crlf +
            'Content-Disposition: form-data; name="file"; ' +
            'filename="' + unescape(encodeURIComponent(file.name)) + '"' + crlf +
            'Content-Type: ' + file.type + crlf + crlf +
            file.recordedContent + crlf +
            doubleDash + boundary + doubleDash + crlf;

    // copy binary content into a ByteArray structure, so that the browser doesn't mess up encoding
    var audioByteArray = new Uint8Array(body.length);

    for (var i=0; i< audioByteArray.length; i++) {
            audioByteArray[i] = body.charCodeAt(i);
    }

    // use an XMLHttpRequest to upload the file
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
                    console.log(xhr.readyState);
    };
    xhr.open('post', url, true);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    // setup AJAX event handlers here

    xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
    xhr.send(audioByteArray.buffer);

诀窍是从ArrayBuffer构建请求,它被视为二进制数据,因此浏览器不会乱用它。或者,如果你只针对firefox,你可以使用xhr.sendAsBinary()(从我读过的,它没有移植到任何其他浏览器,而上面的代码似乎符合W3C)

答案 1 :(得分:0)

您可以尝试对您在base64中发送的数据进行编码。据我所知,无论编码是什么(UTF-8 / Latin-1 /无论如何),它总是有效的。