http://www.cnblogs.com/beniao/archive/2009/05/15/1457679.html
关于多文件上传,以前我一直使用JQuery去动态创建文件选择组件,然后POST到服务器去。最近一段时间一直在Flash身边打滚,Flash对于多文件上传有很好的支持,在CodePrject上有一个Flash的多文件上传组件的开源项目,将其封装为ASP.NET控件,当我们在开发ASP.NET程序的时候可以像使用普通控件一样,从工具箱里拉到界面上就可以使用。
Flash采用Flex开发的,实现了选择文件和统计文件大小的功能,选择了多个文件时会动态的创建Flex组件显示到界面上,并且可以移除所选择的文件。以下是Flex项目结构图:
Flex是完全基于事件驱动的开发模型,通过自定义一个Flex的Application来实现文件的多选和文件数量以及上传文件大小的统计等功能。如上图的FileUpload就是自定义的一个组件,扩展自VBox实现了动态创建组件和处理事件。详细参考下面代码:
自定义组件事件
在Flex的App程序里就使用上面自定义的Application组件来进行设计,详细如下代码块:
< custom:CustomApplication xmlns:mx ="http://www.adobe.com/2006/mxml" xmlns:local ="*"
xmlns:custom ="components.*" layout ="horizontal"
backgroundAlpha ="0" fontSize ="12" >
mx:Style >
.button {fontWeight:normal;}
</ mx:HBox >
mx:VBox width ="400" id ="fileContainer" >
id ="fileUploadBox" maxHeight ="250" width ="100%" label ="Files to Upload" mx:VBox mx:HBox ="uploadStats" visible ="false" >
mx:Text text ="文件总数:" />< ="totalFiles" />
="文件总大小:" ="totalSize" />
mx:ProgressBar ="totalProgressBar" ="275" mode ="manual" ="false" />
>
mx:Button ="browseButton" ="添加文件" ="100" styleName ="button" ="clearButton" ="移除文件" ="uploadButton" ="上传文件" ="cancelButton" ="取消上传" ="mytext" >
custom:CustomApplication >
完成了多文件选择功能的Flash开发,现在就是想法将其生成的.swf封装到dll成为ASP.NET的服务器端控件,实现这一步很非常简单,将生成的.swf作为资源嵌入到ASP.NET的dll文件里就OK。然后自己定义一个类继承于Control,进行相应方法的重写就达到了目的,这里我们就需要重写Render()方法,在方法里通过调用资源的方法从.dll里读取出嵌入里面的.swf文件资源,然后向客户端输出嵌入flash文件(.swf)的编码就完成了。
控件中定义了多个属性,方便可视化设置控件的属性值,其中最为主要的属性为:UploadPage,该属性的作用就是指定通过那一个处理程序来处理上传文件的请求,实现请求中上传文件的保存功能。在示例程序里,我自定义了一个HttpHandler来处理上传文件的请求,实现IHttpHandler接口。程序代码如下:
{
/// <summary>
上传文件处理程序
</summary>
public class UploadHandler : IHttpHandler, IRequiresSessionState
{
#region IHttpHandler 成员
bool IsReusable
{
get { return true ; }
}
void ProcessRequest(HttpContext context)
{
// 文件上传存储路径
string uploadpath = context.Server.MapPath(context.Request.ApplicationPath + " /Upload " );
for ( int i = 0 ; i < context.Request.Files.Count; i ++ )
{
HttpPostedFile uploadFile = context.Request.Files[i];
if (uploadFile.ContentLength > 0 )
{
uploadFile.SaveAs(Path.Combine(uploadpath, uploadFile.FileName));
}
}
HttpContext.Current.Response.Write( " );
}
#endregion
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。