2011-05-23 34 views
8

所以,我已經在MVC3中使用flash運行時實現了plupload。使用MVC3的plupload

它可以完美地工作,因爲它使用更正操作上傳並全部運行。但是,我真的很想能夠控制響應,並在plupload中處理它,但似乎無法通過任何響應。

我試過覆蓋fileUploaded,但我似乎無法得到任何的參數。我試過返回簡單的字符串,JSON和你有什麼。我似乎無法在客戶端獲得任何東西。當然,通過flash發送,我甚至無法用螢火蟲調試請求:/

與Error事件相同,並拋出異常。它正確地將異常解釋爲一個錯誤,但總是會出現#IO ERROR和一些類似2038的代碼或其他代碼。我無法顯示我的異常字符串或任何東西。誰能幫忙?

紅利問題:我會如何發送會話/ cookie數據以及plupload,所以我可以在我的操作中訪問會話?

回答

13

以下爲我工作:

[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 Json(new { message = "chunk uploaded", name = name }); 
} 

,並在客戶端上:

$('#uploader').pluploadQueue({ 
    runtimes: 'html5,flash', 
    url: '@Url.Action("Upload")', 
    max_file_size: '5mb', 
    chunk_size: '1mb', 
    unique_names: true, 
    multiple_queues: false, 
    preinit: function (uploader) { 
     uploader.bind('FileUploaded', function (up, file, data) { 
      // here file will contain interesting properties like 
      // id, loaded, name, percent, size, status, target_name, ... 
      // data.response will contain the server response 
     }); 
    } 
}); 

至於獎金問題而言,我願意回答它通過不使用會話,因爲他們不能很好地擴展,但因爲我知道你可能不會喜歡這個答案,所以你可以在請求中使用multipart_params

然後在服務器perform some hacks上創建適當的會話。

+0

只是出於好奇,你會怎樣用來代替會議?舉個例子,就我個人而言,我只是爲了獲取登錄用戶而使用它。 – Dynde 2011-05-23 09:53:57

+0

@Dynde,這取決於我願意實施的場景。例如,獲取登錄用戶名我會使用表單身份驗證Cookie => User.Identity.Name,如果我需要登錄用戶信息,我會查詢配置文件服務,它會從我的應用程序保留它的任何地方獲取此信息(通常是一個數據庫)。 – 2011-05-23 09:58:30

+0

我聽到你的聲音。對我來說,配置文件查詢只是可以避免與會話,因爲直到今天我不知道使用會話這是一個壞主意:) – Dynde 2011-05-23 10:19:31

5

看吧:

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

並在控制器:

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

這一切......需要在控制器中沒有大塊......