2011-09-23 96 views
0

我在我的MVC 3.0应用程序中使用'Uploadify'Jquery插件来上传多个文件。 它的工作正常,但显示上传失败的文件列表。通过'Uploadify'跟踪成功上传的文件名Jquery插件

如何跟踪成功上传的文件名?

我的脚本是这样的:

<link href="@Href("~/Content/uploadify.css")" rel="stylesheet" /> 
    <script src="@Href("~/Scripts/jquery-1.4.1.js")" type="text/javascript"></script> 
    <script src="@Href("~/Scripts/jquery.uploadify.js")" type="text/javascript"></script> 

<script type="text/javascript"> 
    $(window).load(
    function() { 
     $("#fileuploader").fileUpload({ 
      'uploader': '/Scripts/uploader.swf', 
      'cancelImg': '/Images/cancel.png', 
      'buttonText': 'Select Image', 
      'script': 'Home/Upload', 
      'folder': '/uploads', 
      'fileDesc': 'Image & XML Files', 
      'fileExt': '*.jpg;*.jpeg;*.gif;*.png;*.xml', 
      'multi': true, 
      'auto': true 
     }); 
    } 
); 
    </script> 

我的HTML代码:

<div id="fileuploader"></div> 
<div>Upload Status</div> 
Successful Files : <div> @TempData["SuccessfulFileList"]</div> 
Failed Files :<div> @TempData["FailedFileList"]</div> 

的控制器代码是这样的:

 private static List<string> _successfulFileList = new List<string>(); 
     private static List<string> _failedFileList = new List<string>(); 

     public string Upload(HttpPostedFileBase fileData) 
     { 
      try 
      { 
       var fileName = this.Server.MapPath("~/uploads/" + System.IO.Path.GetFileName(fileData.FileName)); 
       fileData.SaveAs(fileName); 
       _successfulFileList.Add(fileName); 
      } 
      catch 
      { 
       var failedFileName = fileData.FileName; 
       _failedFileList.Add(failedFileName); 
      } 

      TempData["SuccessfulFileList"] = _successfulFileList; 
      TempData["FailedFileList"] = _failedFileList; 
      return "Some Files Get uploaded"; 
     } 
+0

到TempData是没有得到印在我的UI。 – Biki

+0

你有没有调试过,看看'_successfulFileList'和'_failedFileList'实际包含了什么? – Jack

+0

由于它们是静态的,我可以发现只有_successfulFileList被填充,但即使它们存储在tempdata中,它们也不会在我的cshtml中可见。 – Biki

回答

0

您使用Flash组件上传文件(Uploadify)。 Flash组件不发送cookie。会话由cookies进行跟踪。 TempData使用会话。结论=>您无法将FlashData用于Flash客户端。有some ugly workarounds

这就是说,使用控制器中的静态列表来存储上传的文件是非常危险的,因为List<T>对象不是线程安全的,如果你有2个用户并行上传他们的文件,你的应用程序可能会崩溃。

作为一种替代方案,您可以将上传文件的列表存储到您的数据存储库(数据库或其他东西),并从那里取回,而不是依赖会话。

+0

默认情况下不会uploadify使用html5,然后降级为flash? –

+0

但我看到执行流程也不一致。这是由于Flash组件还是由于其异步本质?这些列表只保存最后一个成功的文件或不成功的文件,如果它们不是静态的。如何解决这个问题? – Biki