2010-12-14 5 views
21

Sto usando plupload versione 1.3.0Come utilizzare il pacchetto plupload con ASP.NET MVC?

In particolare, in che modo devo definire l'azione del mio controller per supportare il chunking? Posso usare lo HttpPosteFileBase come parametro?

Al momento sto utilizzando il seguente codice per inizializzare il plugin

Nel tag HEAD

<link type="text/css" rel="Stylesheet" media="screen" href="<%: Url.Content("~/_assets/css/plupload/jquery.ui.plupload.css")%>" /> 
<link type="text/css" rel="Stylesheet" media="screen" href="<%: Url.Content("~/_assets/css/plupload/gsl.plupload.css")%>" /> 
<script type="text/javascript" src="<%: Url.Content("~/_assets/js/plupload/gears_init.js")%>"></script> 
<script type="text/javascript" src="<%: Url.Content("~/_assets/js/plupload/plupload.full.min.js")%>"></script> 
<script type="text/javascript" src="<%: Url.Content("~/_assets/js/plupload/jquery.ui.plupload.min.js")%>"></script> 

Il documento pronto

$("#uploader").pluploadQueue({ 
    runtimes: 'html5,html4,gears,flash,silverlight', 
    url: '<%: Url.Content("~/Document/Upload") %>', 
    max_file_size: '5mb', 
    chunk_size: '1mb', 
    unique_names: true, 
    filters: [ 
     { title: "Documenti e Immagini", extensions: "doc,docx,xls,xlsx,pdf,jpg,png" } 
    ], 
    multiple_queues: false 
}); 
+2

Basta chiedersi il motivo per cui è dichiarata la '' multiple_queues due volte con valori opposti? (errore?) –

+0

@Geovani Martinez: solo un copia e incolla i rifiuti :) – Lorenzo

risposta

41

Qui si va:

[HttpPost] 
public ActionResult Upload(int? chunk, string name) 
{ 
    var fileUpload = Request.Files[0]; 
    var uploadPath = Server.MapPath("~/App_Data"); 
    chunk = chunk ?? 0; 
    using (var fs = new FileStream(Path.Combine(uploadPath, name), chunk == 0 ? FileMode.Create : FileMode.Append)) 
    { 
     var buffer = new byte[fileUpload.InputStream.Length]; 
     fileUpload.InputStream.Read(buffer, 0, buffer.Length); 
     fs.Write(buffer, 0, buffer.Length); 
    } 
    return Content("chunk uploaded", "text/plain"); 
} 

Questo metodo verrà chiamato più volte per ogni blocco e per ogni file che viene caricato. Passerà come parametro la dimensione del blocco e il nome del file. Non sono sicuro se si possa usare un HttpPostedFileBase come parametro di azione perché il nome non è deterministico.

+2

Piccolo bug - la riga 7 dovrebbe essere name not fileName –

+0

@Colin, grazie per averlo indicato. Ho aggiornato la mia risposta. –

+1

Grazie mille per questo pezzo di codice, davvero utile. –

2

Guardate qui:

$("#uploader").pluploadQueue({ 
     // General settings 
     runtimes: 'silverlight', 
     url: '/Home/Upload', 
     max_file_size: '10mb', 
     chunk_size: '1mb', 
     unique_names: true, 
     multiple_queues: false, 

     // Resize images on clientside if we can 
     resize: { width: 320, height: 240, quality: 90 }, 

     // Specify what files to browse for 
     filters: [ 
      { title: "Image files", extensions: "jpg,gif,png" }, 
      { title: "Zip files", extensions: "zip" } 
     ], 

     // Silverlight settings 
     silverlight_xap_url: '../../../Scripts/upload/plupload.silverlight.xap' 
     }); 

     // Client side form validation 
     $('form').submit(function (e) { 
     var uploader = $('#uploader').pluploadQueue(); 

     // Files in queue upload them first 
     if (uploader.files.length > 0) { 
      // When all files are uploaded submit form 
      uploader.bind('StateChanged', function() { 
       if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) { 
        $('form')[0].submit(); 
       } 
      }); 

      uploader.start(); 
     } else { 
      alert('You must queue at least one file.'); 
     } 

     return false; 
     }); 

E nel controller:

[HttpPost] 
public string Upload() { 
      HttpPostedFileBase FileData = Request.Files[0]; 

      if (FileData.ContentLength > 0) { 
      var fileName = Path.GetFileName(FileData.FileName); 
      var path = Path.Combine(Server.MapPath("~/Content"), fileName); 
      FileData.SaveAs(path); 
      } 

      return "Files was uploaded successfully!"; 
     } 

Questo è tutto ... Nessun pezzo è necessaria controller ...

+0

Non funzionerà a meno che la dimensione dell'immagine sia veramente piccola - perché, immagino, solo il primo pezzo viene salvato e se l'immagine è più grande di quella non verrà salvata correttamente . –

+1

'Nessun pezzo è necessario in Controller' !! Come? plupload invierà il blocco all'azione per ogni blocco. quindi ogni pezzo sovrascriverà il precedente. Ho ragione? – Mahmoodvcs

+1

Il chunking è necessario se il file è più grande di 1mb. .NET getterà 'Lunghezza massima richiesta superata. – ppumkin