[翻译]ASP.NET使用Flash多文件上传

源代码下载  原文:Multiple File Upload With Progress Bar Using Flash and ASP.NET

效果预览

             

简介

很难找到一个像样的文件上传控件,能够上传大文件,显示当前进度并且能在浏览器的安全级别设置为中级的环境运行。通常的控件遇到的问题是中级信任级别的环境不允许反射。但是这并不意味着我们就不能达到这个目标。当上传大文件通过流上传的时候,这些控件都努力克服耗尽服务器内存的问题。但是HttpPostedFile类的描述声明“默认情况下,所有的请求,包括表单域和上传的文件大于256 KB的都缓冲到磁盘,而不是在服务器内存中。”所以,我们不必担心这个问题。另外一个问题是如何通过进度条反映当前上传进度。使用Flash‘ fileReference API,它允许通过flash上传文件并保持跟踪上传进度。FileReferenceList允许用户多文件上传。

代码展示

最后我还是抽出时间通过这篇文章来更新Flash组件。我已经用Flex重新写过Flash租金啊,并且添加了大家建议的功能。更新后增加的新功能包括:不删除已添加文件添加新文件;移除单个文件;单个文件的上传进度条;取消后不会上传之前已上传的文件,能够在上传时间添加和取消文件。使用后台代码,这样应该更容易修改代码了。还有,你需要做的只是改动下你的文本编辑器和用Flex 2Sdk编译下。错误处理也更好了,尽管需要额外的代码。因为有些人还想要旧的文件,我也就在源代码里留下了旧的 flieUpload.swf和fileUpload.fla文件。新的源文件FlashFileUpload.swf放在FlashFileUpload_src.zip文件里面,并包含5个文件:

  • FlashFileUpload.mxml - 主程序GUI
  • components\ApplicationClass.as - 主程序后台代码
  • components\FileUpload.as - 单文件上传类
  • components\FileUploadEvent.as - 自定义事件类
  • components\FileUploadProgressChangedEvent.as - 自定义事件类

我不会将这些文件的代码放在这片文章了,你可以下载代码并查看代码中的注释。一个小的声明:我只有一点点ActingScript的编程经历,那也只是从第一次写上传空间和这次经历的。我也没有Flex的编程经历。这是我第一次看Flex。因此,我的代码是不是最佳的方法,或者它本来可以做得更好另一种东西,这是由于我的对flex和actionscript缺少开发经验并且只花了很少的时间在写这篇文章上。我不能对这控件给予任何保证,希望你这篇文章能对你有帮助。

 

代码并不是非常完善,但是我对它的注释已经相当的不错了。我已经将Flash对象封装到了一个服务器控件并且将FlashFileUpload.swf文件嵌入到DLL里。查看UploadPage文件夹内的Default.aspx里使用说明。为了限制文件上传的类型,单个文件的大小,所有文件的大小我改善了服务器控件的选项。当以上工作完成后设置上传网页,查询参数,和javascript函数调用可以轻松地通过设置使用服务器的控制了。

 

我已经给出了一些使用上传控件的例子。包括使用HttpHandler作为上传页面(比使用aspx页面更轻量级),使用需要权限验证的页面,使用sessiongs。我将在这快速的重新演示,但请你以实际代码为准。

 

这些文件的上传完成使用flash(Flashfileupload.swf),并且可以被用于任何服务器端语言,如php,Java,coldfusion,ASP,等。如果它处理文件上传,可以使用Flash控制。即将演示代码的是如何在Asp.Net使用它。

在ASP.NET使用上传控件的第一步:在WebForm里添加这个服务器控件(查看 UploadPage/Default.aspx),然后设置控件的属性。上传页面可以是任何可以处理上传文件的页面,甚至是另外一张Aspx页面。更好的方法是使用HttpHandler,它比Aspx页面更轻量级。因为使用HttpHandler,所有要做的就是一个继承了IhttpHandler的类和web.config里<httpHandlers>节点的设置。还有设置<httpRuntime />节点的masxRequestLength也是一个很好的方法,因为它可以限制上传文件的大小。默认的大小事4M。所以,你想设置最大文件的大小以允许您想要上传的文件。这是一切使用上传空间需要做的。其余的代码是上面说的例子。

Cookies and Flash

在Flash和非IE浏览器里有个Bug。Flash不能发送同上传文件一起发送浏览器里的Cookie。这意味着在上传页面不能使用任何Cookie了。这意味着,sessions和窗体身份验证不能使用其默认实现,因为它们使用cookie。通常这会导致可怕的#2038错误。也有些变通的办法。

Forms Authentication

为了解决在使用forms authentication时Flash的Bug,创建一个新的文件夹然后在文件夹里添加一张Aspx页面。它将是上传页面,所以添加上传控件。在页面载入的时候验证用户是否已授权,如果没有就重定向到登录页面。然后用下面的代码对用户的身份认证进行编码,并把它作为上传控件的查询参数:

FormsIdentity cIdentity = User.Identity as FormsIdentity; 
string encryptString = FormsAuthentication.Encrypt(cIdentity.Ticket); 
flashUpload.QueryParameters = string.Format("User={0}", encryptString);

然后在上传页面,身份验证可以被获取:

string EncryptString = context.Request.QueryString["User"];
FormsAuthenticationTicket UserTicket = FormsAuthentication.Decrypt(EncryptString);

我们可以检查它是否过期,甚至获取到用户的 username:

if(!UserTicket.Expired) 
{ 
    string username = UserTicket.Name; 
}

Sessions

非常不幸sessiongs没有这么简单。为了使用它们,sessiongs必须设置为无cookie。这样做增加了一些无用的网址。通常是对用户透明。在web.config设置它:<sessionStatecookieless="UseUri" />

<sessionState cookieless="UseUri" />

如果使用HttpHandler,还需要继承IRequiresSessionState

posted @ 2009-12-27 13:59  吕飞  阅读(1411)  评论(3编辑  收藏  举报