2012-07-12 18 views
5

Sono nuovo di JQuery e Desidero utilizzare JQuery Ajax per caricare alcuni file sul server, solo nel metodo PUT. quando invio un file binario (come gif o jpeg) al mio server, caricamento riuscito, ma il contenuto dei dati binari è stato modificato (è sempre più grande della dimensione del file originale). Cerco di modificare il tipo di contenuto o il tipo di risultato del file, ma non funziona ancora. Qualcuno sa come risolvere questo problema?Come inviare dati binari tramite metodo JQuery Ajax PUT

PS: Non riesco a codificare il contenuto del file binario in altro formato, perché non riesco a toccare il codice del server.

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

Ho riscontrato un problema simile. La mia prima ipotesi è che questo ha a che fare con il modo in cui la funzione 'ajax' elabora i dati prima di inviare la richiesta. –

+0

Indipendentemente dal macchinario jQuery AJAX, notate che dovreste assegnare una funzione a reader.onloadend - non invocare autonomamente quella funzione! – Tom

risposta

3

La maggior parte (tutte?) Dei browser converte automaticamente i tipi di dati stringa in UTF-8 quando li invio tramite un XMLHttpRequest. Quando leggi il file come una stringa binaria, ti viene dato esattamente questo: un oggetto stringa JavaScript dove ogni carattere è un valore compreso tra 0 e 255.

Per forzare la richiesta AJAX di inviare dati codificati in binario, il parametro data deve essere un oggetto ArrayBuffer, File o Blob.

Se è necessario accedere al contenuto del file prima dell'invio, è possibile convertire la stringa binaria a un ArrayBuffer con il seguente codice:

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); 
} 

e desideri passare l'istanza arrBuff alla funzione AJAX . In caso contrario, si dovrebbe essere in grado di passare l'oggetto File nella funzione AJAX senza tutto il codice FileReader.

Problemi correlati