2013-06-26 8 views
5

Sto lavorando a un progetto necessario caricare file di grandi dimensioni sul lato server. Ho deciso di utilizzare HTML5 FileReader e jQuery per caricare il file in blocchi (ArrayBuffer).Invia ArrayBuffer con un'altra stringa in una chiamata Ajax tramite jQuery

Ho completato correttamente questa operazione convertendo i blocchi in una stringa base64, inviata al server di back-end tramite jQuery.post con il parametro data in formato JSON.

Per esempio

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

Ma mi piacerebbe per ottimizzare questo codice dal base64 è troppo grande da trasformare. Mi piacerebbe sapere se potrei inviare ArrayBuffer direttamente tramite $.ajax.

So che se imposto lo processData: false e inserisco ArrayBuffer nei parametri dei dati, potrebbe essere inviato al mio server come Request.InputStream. Ma in questo modo non posso allegare altri dati come name e index.

Mi piacerebbe sapere se posso inviare l'ArrayBuffer (o blob, binario) non elaborato da solo con i miei altri dati (nome, indice) in una chiamata ajax.

risposta

4

Penso di aver risolto questo problema. Posso usare FormData per trasformare i miei dati strutturati da solo con file binari in un unico modulo. Codice come questo

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

Poi dal lato server che può recuperare i miei dati strutturati dalla Request.Form mentre il contenuto binario da Request.Files[0]

Problemi correlati