2012-07-12 14 views
5

Jestem nowy w JQuery i Chcę użyć Ajax JQuery do przesyłania niektórych plików na serwer, tylko w metodzie PUT. kiedy wysyłam plik binarny (taki jak gif lub jpeg) do mojego serwera, upload succeed, ale zawartość danych binarnych została zmieniona (zawsze jest większa niż oryginalny rozmiar pliku). Próbuję zmienić typ zawartości lub typ pliku, ale nadal nie działa. Ktoś wie, jak to naprawić?Jak wysłać dane binarne przez JQuery Metoda Ajax PUT

PS: Nie mogę zakodować zawartości pliku binarnego w innej formie, ponieważ nie mogę dotknąć kodu serwera.

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

Znam podobny problem. Moim pierwszym przypuszczeniem jest to, że ma to związek ze sposobem, w jaki funkcja 'ajax' przetwarza dane przed wysłaniem żądania. –

+0

Bez względu na maszynę jQuery AJAX zauważ, że powinieneś przypisać funkcję do reader.onloadend - nie wywołaj tej funkcji samodzielnie! – Tom

Odpowiedz

3

Większość (wszystkie?) Przeglądarek automatycznie konwertować typy danych do UTF-8 przy wysyłaniu ich za pomocą XMLHttpRequest. Kiedy czytasz plik jako ciąg binarny, otrzymujesz dokładnie to: obiekt napisu JavaScript, w którym każdy znak ma wartość od 0 do 255.

Aby wymusić wysłanie przez AJAX żądania zakodowanych danych binarnych, parametr danych musi być obiektem ArrayBuffer, File lub Blob.

Aby uzyskać dostęp do zawartości pliku przed wysłaniem, można przekonwertować ciąg binarny do ArrayBuffer z następującego kodu:

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

I chcesz przekazać instancję arrBuff do funkcji AJAX . W przeciwnym razie powinieneś być w stanie przekazać obiekt File samemu do funkcji AJAX bez całego twojego kodu FileReader.

Powiązane problemy