2012-07-12 86 views
5

Soy nuevo en JQuery y Quiero usar JQuery Ajax para cargar algunos archivos en el servidor, solo en el método PUT. cuando envío algún archivo binario (como gif o jpeg) a mi servidor, la carga se realiza correctamente, pero se modificó el contenido de los datos binarios (siempre es más grande que el tamaño del archivo original). Intento cambiar el tipo de contenido o el tipo de resultado del archivo, pero todavía no funciona. ¿Alguien sabe cómo solucionar esto?Cómo enviar datos binarios a través del método JQuery Ajax PUT

PD: No puedo codificar el contenido del archivo binario en otra forma, porque no puedo tocar el código del servidor.

var reader = new FileReader(); 

reader.onloadend = (function(Thefile) { 

    $.ajax({ 
     url: url, 
     processData:false, 
     //contentType:"application/octet-stream; charset=UTF-8", 
     data: file.result, 
     type: 'PUT', 
     success : function(){console.log("OK!");}, 
     error : function(){console.log("Not OK!");} 
    }); 
})(file); 

reader.readAsBinaryString(file); 
+0

He encontrado un problema similar. Mi primera suposición es que esto tiene que ver con la forma en que la función 'ajax' procesa los datos antes de enviar la solicitud. –

+0

Independientemente de la maquinaria jQuery AJAX, observe que debe asignar una función a reader.onloadend, ¡no invoque esa función usted mismo! – Tom

Respuesta

3

La mayoría (todos?) Los navegadores convertir automáticamente los tipos de datos de cadena a UTF-8 cuando enviarlos a través de un XMLHttpRequest. Cuando lee el archivo como una cadena binaria, se le da exactamente eso: un objeto de cadena JavaScript donde cada carácter es un valor entre 0 y 255.

Para forzar la solicitud AJAX de enviar datos codificados en binario, el parámetro de datos debe ser un objeto ArrayBuffer, File o Blob.

Si necesita acceder a los contenidos del archivo antes de enviarlo, puede convertir la cadena binaria a una ArrayBuffer con el siguiente código:

var arrBuff = new ArrayBuffer(file.result.length); 
var writer = new Uint8Array(arrBuff); 
for (var i = 0, len = file.result.length; i < len; i++) { 
    writer[i] = file.result.charCodeAt(i); 
} 

y que le pase la instancia arrBuff a la función AJAX . De lo contrario, debería poder pasar el objeto File en sí mismo a la función AJAX sin todo su código FileReader.

Cuestiones relacionadas