2013-06-26 23 views
5

Tôi đang làm việc trên một dự án cần tải lên tệp lớn lên phía máy chủ. Tôi quyết định sử dụng HTML5 FileReader và jQuery để tải tệp lên theo khối (ArrayBuffer).Gửi ArrayBuffer với chuỗi khác trong một cuộc gọi Ajax qua jQuery

Tôi đã hoàn tất thành công tác vụ này bằng cách chuyển các đoạn thành chuỗi base64, gửi tới máy chủ phụ trợ thông qua jQuery.post với tham số dữ liệu ở định dạng JSON.

Ví dụ

$.ajax({ 
    url: "/Home/Upload", 
    type: "POST", 
    data: { 
     name: block.name, 
     index: block.index, 
     base64: base64 
    }, 
    processData: true 
}); 

Nhưng tôi muốn để tối ưu hóa mã này kể từ base64 là quá lớn để chuyển đổi. Tôi muốn biết nếu tôi có thể gửi ArrayBuffer trực tiếp thông qua $.ajax.

Tôi biết rằng nếu tôi đặt processData: false và chỉ cần đặt ArrayBuffer vào tham số dữ liệu, nó có thể được gửi đến phía máy chủ của tôi là Request.InputStream. Nhưng theo cách này, tôi không thể đính kèm dữ liệu khác như nameindex.

Tôi muốn biết tôi có thể gửi ArrayBuffer thô (hoặc blob, nhị phân) một mình với dữ liệu khác của tôi (tên, chỉ mục) trong một cuộc gọi ajax hay không.

Trả lời

4

Tôi nghĩ rằng tôi đã giải quyết được sự cố này. Tôi có thể sử dụng FormData để chuyển đổi dữ liệu có cấu trúc của mình một mình với tệp nhị phân trong một biểu mẫu. Mã như thế này

 
var blob = file.slice(block.start, block.end); 
// use formdata to send block content in arraybuffer 
var fd = new FormData(); 
fd.append("name", block.name); 
fd.append("index", block.index); 
fd.append("file", blob); 
$.ajax({ 
    url: "/Home/UploadInFormData", 
    data: fd, 
    processData: false, 
    contentType: "multipart/form-data", 
    type: "POST", 
    success: function (result) { 
     if (!result.success) { 
      alert(result.error); 
     } 
     callback(null, block.index); 
    } 
}); 

Sau đó từ phía máy chủ tôi có thể lấy dữ liệu có cấu trúc của tôi từ Request.Form trong khi nội dung nhị phân từ Request.Files[0]

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