2011-05-12 26 views
5

Estoy trabajando en una aplicación de Chrome que utiliza la API del Sistema de Archivos HTML5, y permite a los usuarios importar y sincronizar archivos. Un problema que tengo es que si el usuario intenta sincronizar archivos de imagen, los archivos se corrompen durante el proceso de carga en el servidor. Supongo que es porque son binarios.Cargar un archivo binario usando JavaScript puro

Para cargar, opté simplemente por hacer una solicitud AJAx POST (usando MooTools) y luego puse el contenido del archivo como el cuerpo de la solicitud. Le dije a MooTools que apagara urlEncoding y establezca el juego de caracteres en "x-user-defined" (no estoy seguro si eso es necesario, acabo de verlo en algunos sitios web).

Dado que Chrome no tiene soporte para xhr.sendAsBinary, ¿alguien tiene algún código de muestra que me permita enviar archivos binarios a través de Ajax?

Respuesta

6

xhr.sendAsBinary() de FF no es estándar. XHR2 apoya el envío de archivos (xhr.send(file)) y manchas (xhr.send(blob)):

function upload(blobOrFile) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', '/server', true); 
    xhr.onload = function(e) { ... }; 

    // Listen to the upload progress. 
    xhr.upload.onprogress = function(e) { ... }; 

    xhr.send(blobOrFile); 
} 

También puede enviar un ArrayBuffer.

0

SI está escribiendo el servidor, puede simplemente transformar los bytes que lee en texto puro, enviarlos al servidor y luego decodificarlos de nuevo.

Aquí es la forma más simple (no es muy eficiente, pero eso es sólo para mostrar la técnica) -

traducir cada byte se lee desde el archivo en una cadena de dos caracteres hexadecimales. Si lee el byte 53 (en decimal), luego traduzca a "45" (la representación hexadecimal de 53). concatenar todas estas cadenas juntas, y enviar la cadena resultante al servidor.

En el lado del servidor, rompa la cuerda en posiciones pares, traduzca cada par de dígitos en un byte.

+1

¿No sería más eficiente usar base64 y las funciones de JavaScript 'atob' y' btoa'? –

Cuestiones relacionadas