2010-12-14 8 views
21

Używam plupload wersja 1.3.0Jak korzystać z pakietu plupload z ASP.NET MVC?

Bardziej szczegółowo, w jaki sposób muszę zdefiniować moje działania kontrolera w celu wspierania chunking? Czy mogę użyć parametru HttpPosteFileBase jako parametru?

Obecnie używam następujący kod do zainicjowania Wtyczka

w tagu 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> 

Na dokumencie gotowy

$("#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

prostu zastanawiasz się, dlaczego jest ogłoszony multiple_queues ' dwa razy z przeciwnymi wartościami? (literówka?) –

+0

@Geovani Martinez: tylko kopia i wklej śmieci odmówić :) – Lorenzo

Odpowiedz

41

Proszę bardzo:

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

Ta metoda będzie wywoływana wiele razy dla każdego fragmentu i dla każdego przesłanego pliku. Przekaże jako parametr rozmiar porcji i nazwę pliku. Nie jestem pewien, czy można użyć parametru HttpPostedFileBase jako parametru akcji, ponieważ nazwa nie jest deterministyczna.

+2

Mały błąd - linia 7 powinna być nazwa nie fileName –

+0

@Colin, dzięki za wskazanie tego. Zaktualizowałem swoją odpowiedź. –

+1

Bardzo dziękuję za ten fragment kodu, bardzo pomocny. –

2

Spójrz tutaj:

$("#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; 
     }); 

A w kontrolerze:

[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!"; 
     } 

To wszystko ... Nie porcja jest potrzebna w kontrolerze ...

+0

Nie zadziała, jeśli rozmiar obrazu jest naprawdę mały - ponieważ, jak sądzę, tylko pierwsza porcja zostaje zapisana, a jeśli obraz jest większy, to nie zostanie zapisany prawidłowo . –

+1

'Żaden fragment nie jest potrzebny w kontrolerze' !! W jaki sposób? plupload wyśle ​​porcję do akcji dla każdej porcji. więc każda porcja zastąpi poprzednią. Czy mam rację? – Mahmoodvcs

+1

Chunking jest potrzebny, jeśli plik jest większy niż 1mb. .NET rzuci "Przekroczono maksymalną długość żądania." – ppumkin