2010-12-14 2 views
21

J'utilise plupload version 1.3.0Comment utiliser le paquet plupload avec ASP.NET MVC?

Plus précisément comment dois-je définir mon action de contrôleur pour prendre en charge la segmentation? Puis-je utiliser le HttpPosteFileBase en tant que paramètre?

En ce moment je suis en utilisant le code suivant pour initialiser le plugin

Dans la balise 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> 

Le document prêt

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

Je me demandais pourquoi 'multiple_queues' est déclarée deux fois avec des valeurs opposées? (faute de frappe?) –

+0

@Geovani Martinez: juste un copier-coller refuse :) – Lorenzo

Répondre

41

vous allez ici:

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

Cette méthode sera appelée plusieurs fois pour chaque segment et pour chaque fichier téléchargé. Il passera en paramètre la taille du bloc et le nom du fichier. Je ne suis pas sûr de savoir si vous pouvez utiliser un HttpPostedFileBase comme paramètre d'action car le nom n'est pas déterministe.

+2

Petit bug - ligne 7 devrait être nom pas fileName –

+0

@Colin, merci de le signaler. J'ai mis à jour ma réponse. –

+1

Merci beaucoup pour ce morceau de code, vraiment utile. –

2

Regardez ici:

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

Et dans le contrôleur:

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

C'est tout ... Aucun morceau est nécessaire dans le contrôleur ...

+0

Cela ne fonctionnera que si la taille de l'image est vraiment petite - parce que, je suppose, seul le premier bloc sera sauvegardé et si l'image est plus grande, elle ne sera pas sauvegardée correctement . –

+1

'Aucun morceau n'est nécessaire dans Controller' !! Comment? plupload enverra le morceau à l'action pour chaque morceau. donc chaque morceau remplacera le précédent. Ai-je raison? – Mahmoodvcs

+1

Le regroupement est nécessaire si le fichier est plus grand que 1mb. – ppumkin

Questions connexes