2013-06-26 10 views
5

Pracuję nad projektem, który należy przesłać dużym plikiem po stronie serwera. Postanowiłem użyć HTML5 FileReader i jQuery, aby przesłać plik w porcjach (ArrayBuffer).Wysyłaj ArrayBuffer z innym ciągiem w jednym wywołaniu Ajax za pośrednictwem jQuery

Pomyślnie zakończyłem to zadanie, konwertując porcje do łańcucha base64, wysyłając do serwera zaplecza za pośrednictwem jQuery.post z parametrem danych w formacie JSON.

Na przykład

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

Ale chciałbym, aby zoptymalizować ten kod od base64 jest zbyt duża, aby przekształcić. Chciałbym wiedzieć, czy mogę wysłać ArrayBuffer bezpośrednio przez $.ajax.

Wiem, że jeśli ustawię processData: false i po prostu wprowadzę ArrayBuffer do parametru danych, może on zostać wysłany na moją stronę serwera jako Request.InputStream. Ale w ten sposób nie mogę dołączyć innych danych, takich jak name i index.

Chciałbym wiedzieć, czy mogę wysłać surowy ArrayBuffer (lub blob, binarny) sam z innymi danymi (nazwa, indeks) w jednym wywołaniu ajax.

Odpowiedz

4

Myślę, że udało mi się rozwiązać ten problem. Mogę użyć FormData do transformacji moich danych strukturalnych z plikiem binarnym w jednym formularzu. Kod jak ten

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

Wtedy od strony serwera mogę odzyskać moje dane strukturalne z Request.Form natomiast binarne treści z Request.Files[0]

Powiązane problemy