为了增加人气,本人特悔过自新从新作人:),将本人开发的上传下载控件一一解析,期望能略微提升一点人气:) ,另请访问本控件示例站点


一、控件开发思想

目前在本人开发的很多项目中都会遇到文件上传下载的问题,为了一次性解决所有这些令人头痛的问题,我特意开发了这个组件。而为了满足大多数的应用场合,在开发之前我特意总结了需要用到上传下载控件的三种场合,并使自己开发的控件完全适应这三种场合。

场合一:
    上传到服务器端的文件名为服务器端指定的文件名,比如我想为某一电子产品维护驱动程序下载,而项目要求下载的文件名必需为
string.Format("{0}_{1}.zip" ,productID, OSName)。如AP2000_WinXp.Zip。

场合二:
    上传到服务器端的文件名为自动生成,主要用来对上传文件量比较大,而对名称没有要求的场合,如新闻中所带的图片等等。

场合三:
    上传到服务器端的文件名为客户端的文件名,就象博客中插入图片或下载文件一样。

为了满足上面三种场合我特意声明了下面的枚举类:

    public enum FileNameType
    
{
        AutoGenerate,
        ClientSide,
        ServerSide
    }

同时声明如下属性:

        [ 
        NotifyParentProperty(
true),
        Category(
"Appearance"), 
        DefaultValue(
typeof(FileNameType),"ClientSide")
        ] 
        
public FileNameType UploadFileNameType
        
{
            
get
            
{
                
object o = ViewState[UploadFileNameTypeKey];
                
return(o==null)? FileNameType.ClientSide:(FileNameType)o;
            }

            
set
            
{
                ViewState[UploadFileNameTypeKey] 
= value;
            }

        }


而通常来讲对于文件的操作无非是上传、下载、删除三个操作,因此界面上并没有很特别的界面元素并没有很复杂的绘制要求,因此我决定用复合控件来实现它的开发,而且对于上传控件我们也不会关心他的高度,背景色,字体等等因此我决定控件从Control继承而不是从WebControl继承,而为了实现子控件的名称的唯一性控件同时实现了INamingContainer标志接口。
而为了使上传的文件名支持验证器控件所以加了validationPropertyAttribute并指向FileName,为了使客户端的验证正常工作,ASP.Net要求在客户端一定存在以控件ID命名的基于input窗体元素,因此我在创建复合控件时还多加了一个inputhidden控件用来支持客户端的验证,该inputhidden.value属性中保存有当前的上传的文件名称.而为了支持有效扩展名数组的内部属性而增加了ParseChildren(true)和PersistChildren(false)属性,由上面的分析我得到了下面的Upload声明.

    [DefaultProperty("FileName"), 
    ValidationPropertyAttribute(
"FileName"),
    ParseChildren(
true),
    PersistChildren(
false),
    ToolboxData(
"<{0}:Upload runat=server></{0}:Upload>")]
    
public class Upload : System.Web.UI.Control,INamingContainer


为了增加上传文件类型的验证我声明ExtFilter属性用来保存有效的扩展文件名

        ExtFilters


至此上传控件中的所有主要元素已经分析清楚,下篇文章我将开始具体的开发工作