XmlHttpRequest overrideMimeType для исходящих данных - PullRequest
5 голосов
/ 02 марта 2011

Я хочу, чтобы XmlHttpRequest не трогал (т.е. конвертировал в UTF-8 или любую другую кодировку) какие-либо символы, которые он отправляет и получает на / с сервера.

Для символов, полученных с сервера, я знаю, что могу сделать XmlHttpRequest#overrideMimeType('text/plain; charset=x-user-defined'), и символы остаются одни.

Однако для символов, отправленных на сервер с помощью вызова XmlHttpRequest#send, я не смог найти способ XmlHttpRequest не касаться этих символов.Я вижу, что XmlHttpRequest кодирует их в UTF-8 независимо от того, что я пытался.Есть ли способ предотвратить это?

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Я столкнулся с подобной проблемой при загрузке звука, снятого с микрофона (через вспышку).Вот как я это решил (проверено в FF 9 и Chromium 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-совместимым)

0 голосов
/ 02 марта 2011

Вы можете попытаться закодировать данные, которые вы отправляете, в base64.Насколько я знаю, это всегда будет в силе, независимо от того, какая кодировка в (UTF-8 / Latin-1 / что угодно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...