2012-07-12 28 views
5

Tôi mới sử dụng JQuery và Tôi muốn sử dụng JQuery Ajax để tải một số tệp lên máy chủ, Chỉ trong phương thức PUT. khi tôi gửi một số tệp nhị phân (chẳng hạn như gif hoặc jpeg) đến máy chủ của tôi, tải lên thành công, nhưng nội dung của dữ liệu nhị phân đã bị thay đổi (nó luôn lớn hơn kích thước tệp gốc). Tôi cố gắng thay đổi kiểu nội dung hoặc loại kết quả tệp, nhưng vẫn không hoạt động. Bất cứ ai cũng biết cách sửa lỗi này?Cách gửi dữ liệu nhị phân qua phương pháp JQuery Ajax PUT

PS: Tôi không thể mã hóa nội dung của tệp nhị phân sang dạng khác, vì tôi không thể chạm vào mã của máy chủ.

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

Tôi đã gặp sự cố tương tự. Suy đoán đầu tiên của tôi là điều này liên quan đến cách hàm 'ajax' xử lý dữ liệu trước khi gửi yêu cầu. –

+0

Bất kể máy móc AJAX của jQuery, chú ý bạn nên gán một hàm cho reader.onloadend - không gọi hàm đó cho chính bạn! – Tom

Trả lời

3

Hầu hết (tất cả?) Trình duyệt sẽ tự động chuyển đổi kiểu dữ liệu chuỗi thành UTF-8 khi gửi chúng qua XMLHttpRequest. Khi bạn đọc tệp dưới dạng chuỗi nhị phân, bạn được cung cấp chính xác rằng: đối tượng chuỗi JavaScript trong đó mỗi ký tự là một giá trị từ 0 đến 255.

Để buộc yêu cầu AJAX gửi dữ liệu được mã hóa nhị phân, tham số dữ liệu phải là một đối tượng ArrayBuffer, File hoặc Blob.

Nếu bạn cần truy cập vào nội dung của file trước khi gửi, bạn có thể chuyển đổi các chuỗi nhị phân đến một ArrayBuffer với đoạn mã sau:

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

Và bạn muốn vượt qua dụ arrBuff đến chức năng AJAX . Nếu không, bạn sẽ có thể tự chuyển đối tượng File thành hàm AJAX mà không cần tất cả mã FileReader của bạn.

Các vấn đề liên quan