javascript - responsexml - XmlHttpRequest overrideMimeType para datos salientes
script innerhtml (2)
Quiero que XmlHttpRequest
no toque (es decir, convertir a UTF-8
o cualquier otra codificación) cualquiera de los caracteres que está enviando y recibiendo desde / hacia el servidor.
Para los caracteres recibidos del servidor, sé que puedo hacer XmlHttpRequest#overrideMimeType(''text/plain; charset=x-user-defined'')
y los caracteres se dejan solos.
Sin embargo, para los caracteres enviados al servidor a través de XmlHttpRequest#send
call, no pude encontrar una manera de decirle a XmlHttpRequest
que no toque esos caracteres. Veo que XmlHttpRequest
codifica en UTF-8
sin importar lo que intenté. ¿Hay alguna forma de prevenir esto?
Podría intentar codificar los datos que envía en base64. Hasta donde yo sé, eso siempre será válido, independientemente de la codificación que esté en (UTF-8 / Latin-1 / whatever).
Me encontré con un problema similar para cargar audio capturado desde un micrófono (a través de flash). Así es como lo resolví (probado en FF 9 y cromo 15). El siguiente código js toma una entrada binaria como una cadena y la carga en el servidor sin alteraciones / codificación. Con suerte, esto puede ser útil para alguien.
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);
El truco es construir la solicitud desde un ArrayBuffer, que se ve como datos binarios, para que el navegador no se meta con eso. Alternativamente, si solo apunta a Firefox, podría usar xhr.sendAsBinary () (según lo que he leído, no está portado a ningún otro navegador, mientras que el código anterior parece compatible con W3C)