2010-12-14 37 views
21

Tôi đang sử dụng plupload phiên bản 1.3.0Làm thế nào để sử dụng gói plupload với ASP.NET MVC?

Cụ thể hơn là tôi phải xác định hành động điều khiển của mình để hỗ trợ chunking như thế nào? Tôi có thể sử dụng thông số HttpPosteFileBase làm thông số không?

Hiện nay tôi đang sử dụng đoạn mã sau để khởi tạo các plugin

Trong thẻ 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> 

Mở tài liệu đã sẵn sàng

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

Chỉ cần tự hỏi tại sao 'multiple_queues' được khai báo hai lần với các giá trị ngược lại? (typo?) –

+0

@Geovani Martinez: chỉ cần sao chép và dán từ chối :) – Lorenzo

Trả lời

41

Ở đây bạn đi:

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

Phương thức này sẽ được gọi nhiều lần cho mỗi đoạn và cho mỗi tệp được tải lên. Nó sẽ vượt qua như tham số kích thước chunk và tên tập tin. Tôi không chắc chắn liệu bạn có thể sử dụng tham số hành động HttpPostedFileBase vì tên không phải là xác định hay không.

+2

Lỗi nhỏ - dòng 7 phải là tên không phải là fileName –

+0

@Colin, cảm ơn vì đã chỉ ra điều này. Tôi đã cập nhật câu trả lời của mình. –

+1

Cảm ơn bạn rất nhiều vì đoạn mã này, thực sự hữu ích. –

2

Look đây:

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

Và trong Bộ điều khiển:

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

Đó là tất cả ... Không có đoạn là cần thiết trong điều khiển ...

+0

Nó sẽ không hoạt động trừ khi kích thước hình ảnh thực sự nhỏ - bởi vì, tôi đoán, chỉ đoạn đầu tiên được lưu và nếu hình ảnh lớn hơn nó sẽ không được lưu đúng cách . –

+1

'Không có đoạn là cần thiết trong Controller' !! Làm sao? plupload sẽ gửi đoạn hành động cho mỗi đoạn. vì vậy mọi đoạn sẽ ghi đè lên phần trước đó. Tôi có đúng không? – Mahmoodvcs

+1

Chunking là cần thiết nếu tập tin lớn hơn 1mb. .NET sẽ ném 'Tối đa yêu cầu tối đa vượt quá.' – ppumkin

Các vấn đề liên quan