zoukankan      html  css  js  c++  java
  • HTML5文件上传器,纯脚本无插件的客户端文件上传器---Uploader 文件上传器类

    概述

     

    客户端完全基于JavaScript的 浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务 端处理,由服务端存储断点信息实现断点续传的功能;支持文件拖拽上传,直接将文件拖拽到页面元素上方即可自动上传(默认元素是body);服务端采用asp.net 4.0程序开发,包含有处理程序,提供程序和视图控件,当然也可以用java或者php实现服务端程序。

     

    浏览器兼容:IE10+、火狐、谷歌、Opera、windows phone 8.1

     

    js代码:包含开发版和发布版两个版本,开发版包含有帮助信息,文件大小11kb;而发布版移除了帮助信息,文件大小9kb;

     

     

    风险提示

     

    此控件通过将文件切片上传超大文件,绕过了ASP.NET内置的MaxRequestLength最大请求检查,建议在服务端进行有效的安全检查。

     

     

    技术支持

     

    Jackson.bruce@live.com 您对此控件有任何要求和疑问都可以给发邮件。

     

     

     

    客户端JavaScript代码

     

    window.Uploader

     

    静态属性:

     

    名称

    类型

    描述说明

    Version

    Object类型

    {major:1 //主版本号

    ,minor:0 //次版本号

    ,revision:0//修订号

    }

    Support

    布尔类型

    当前浏览器是否支持此上传器

    Sliced

    枚举类型

    切片上传的开启状态

    { Auto: 0 //当文件超过数据块(blobSize)大小时,启用切片上传

    , Enabled: 1//始终将文件分割为N个数据块上传

    , Disabled: 2 //始终将整个文件上传

    }

    ErrorType

    枚举类型

    描述错误的类型

    {

             InvalidType: 0  //当验证文件类型无效时得到此类异常,无效的文件类型,

            ,

            UpperLimit: 1 //文件的大小超过指定的上限

            ,

            HttpType: 2  //传输过程中抛出的HTTP类型的错误

            ,

            ServerType: 3 //数据已成功送达服务器,但不是500错误,有服务端验证文件类型失败,或者验证用户身份与授权失败时由程序抛出的错误类型。

            ,

            UserAbort: 4  //用户手动终止上传的错误类型

            ,

            InvalidOperation: 5 //调用续传方法时,如果文件已经正在上传中,那么是为此操作无效。

        };

     

     

    静态方法

    名称

    返回类型

    描述

    SizeToString

    返回string类型,它包含表示大小的数值和字节单位

    两参数size:字节的总数,num:精确度

     

     

    属性:

    名称

    类型

    描述说明

    version

    Object类型

    这个同静态属性

    support

    布尔值

    这个同静态属性

     

    方法

    名称

    返回类型

    描述说明

    settings

    返回变体类型

    读取传递给构造函数的settings设置的字段值,例如:o.settings("url")  读取当前服务端的处理路径

    on

    没有返回值

    绑定事件,后面将会介绍事件,例如:o.on("error",function(file,args){}) 或者 o.on({error:function(file,args){},success:function(file,args){}});

    upload

    没有返回值

    上传指定的文件列表,需要传递一个文件列表的参数

     

    事件 (所有事件都是可选的)

    名称

    参数

    描述说明

    selecting

    function(file,args)

    当开始选取文件时触发,参数args:{

    cancel: false //是否取消上传

    ,invalidType:false||true //文件类型是否有效的

    }

    this 是Uploader类型

    validate

    function(file,args)

    selecting事件前触发,验证选择文件的类型是否有效,参数 args : {

    invalid: true // 返回默认是true表示无效的,如果文件是有效的类型,那么返回false

    , accept: string //表示对应的settings设置,对话框里面接受的文件类型。

    ,types: Arry  //数组表示有效的文件类型列表,可以通过settings设置的

    };

    selected

    function(file)

    当已经选取要上传的文件时触发,this 是Uploader类型

    upload

     function(file,args)

    当开始上传文件时触发,args.cancel 是否要取消上传,this 是Uploader类型

    createProgress

     function(file,args)

    当创建进度视图时触发, args.view:返回已经创建的视图 ,如果为null 那么上传器将会智能创建简单的视图。this 是Uploader.Progress类型

    getResumableInfoHandler

     function(url,params,callback)

    正在获取续传信息时触发 url:服务端处理程序,params:文件参数 {fileType:string,fileName:string,fileSize:number,blobSize: number,blobCount:number} callback:function(info) 需要传递续传信息给回调函数,传信息应包含 Info.key 文件唯一标识,可以是MD5或者是GUID等类型这个取决于服务端的提供程序

    Info.index 上一次成功保存的数据块索引,如果是首次上传那么应该是0

    this 是Uploader.Progress类型

    progress

    function(file,args)

    当更新进度视图触发,args: {view:当前视图,cancel: false,size :文件大小,loaded:已经上传的大小,percent:0 ~ 100}  args.cancel 是取消默认动作

    this 是Uploader.Progress类型

    complete

    function(file,args)

    当文件上传完成时触发 参数args:{view:当前视图, req: XMLHttpRequest, status:XMLHttpRequest.status}

    this 是Uploader.Progress类型

    success

    function(file,args)

    当文件上传成功时触发, args:{view:当前视图

    , result:{…}  //结果 如果有错将包含 err 或者 error 属性

    ,responseText: XMLHttpRequest.responseText // 服务端返回的数据

    ,cancel: false

    , req: XMLHttpRequest对象

    ,responseType:  XMLHttpRequest.responseType

    , responseXML: XMLHttpRequest.responseXML}

    this 是Uploader.Progress类型

    error

    function(file,args)

    当引发错误时触发 args:{

    view: 当前视图

    ,type:Uploader.ErrorType

    ,code:number

    ,message:string }

    this 是Uploader.Progress类型

    pause

    function(file,args)

    当用户暂停上传时触发,args:{ view: view }

    proceed

    function(file,args)

    当用户点击续传时触发,args:{ view: view,cancel:false }

    cancel

    function(file,args)

    当用户点击取消动作并成功取消时触发,args:{ view: view }

    drop

    function(e)

    启动拖拽上传时(dragable=true)在拖拽容器上拖拽时触发的事件

    dragover

    function(e)

    启动拖拽上传时(dragable=true)在拖拽容器上拖拽时触发的事件

    dragleave

    function(e)

    启动拖拽上传时(dragable=true)从拖拽容器上拽出时触发的事件

     

    构造函数与settings配置

     

    Uploader 构造函数

    参数:settings  是object类型

    属性

    名称

    类型

    描述说明

    placeholder

    可选的类型:jQuery对象或者字符串类型的jQuery选择器

    打开文件选择器的占位符,例如:"#btnSelectFiles"

    multiple

    布尔值

    文件选择器对话框是否支持多选,默认值true

    accept

    string类型

    接受的文件类型,默认值是空的,即是接受全部类型,例如:"image/*,video/*" 接受所有图片和视频文件

    types

    string类型

    允许上传的的文件类型,在上传文件之前通过此类型类别验证文件的扩展名,这个类型应该与上面的accept尽量对应,例如:accept="image/jpeg,image/gif,image/png" 那么验证类型列表types应该是".jpg;.gif;.png" 这个是客户端验证的类型列表,但在服务端也要应该做同样的验证。

    timeout

    number类型

    超时设置,默认是0,没有设置

    maxQueue

    number类型

    最大的队列数,默认是2,即是同时上传2个文件,如果超过2个文件,那么其他文件将在队列中等候,例如:您上传4个文件,那么前2个文件开始上传,其余的两个文件将在队列中等候直到队列中有其他文件完成了才开始上传。

    dragable

    布尔值

    是否可以拖拽文件上传,默认是未开启的

    dragContainer

    可选的类型:jQuery对象或者字符串类型的jQuery选择器

    文件拖拽入的容器,默认是body,如:"#container"  或者 $("#container" )

    progress

    可选的类型:jQuery对象或者字符串类型的jQuery选择器

    文件上传进度列表容器,如:"#progressList"

    blobSize

    number 类型

    文件切片上传时,单个数据块的大小,单位是字节

    sliced

    枚举类型

    是否支持切片上传可用值:Uploader.Sliced.Auto

    ,Uploader.Sliced.Enabled

    ,Uploader.Sliced.Disabled 默认值 Uploader.Sliced.Auto

    limitSize

    number 类型

    上传文件大小限制,单位是字节,默认值0 表示没有限制,出于安全考虑建议设置一定的大小进行限制上传的文件,同时在服务端也要进行验证。

    url

    string类型

    服务端的处理程序,默认值是当前浏览器的地址(location.href

    如:"/fileUpload/handler"

    parseResult

    function(serverData)

    函数用来解析服务端返回的结果集 返回值是object如果服务端有错误应该返回{err:true,msg:“错误描述”}的对象

    params

    {name:value[,name1:value1]…}

    提交到服务端的自定义参数,object类型

     

    参数events 是object类型 包含绑定的事件,请参照事件绑定。

     

     

    Uploader.Progress

     

    这个是一个封闭的类,在外部无法创建它的实例,从createProgress事件开始得到此类型的一个实例,它包含以下方法和属性:

     

    属性

    名称

    类型

    描述说明

    owner

    Uploader类型

    创建者

    size

    number类型

    文件的大小,只读的,单位是字节

    blobSize

    number类型

    数据块的大小,只读的,单位是字节

    sliced

    布尔值

    是否将文件分割上传,只读的

    view

    jQuery

    createProgress事件创建的进程视图

    bar

    jQuery

    进度视图里的进度条

    resumableKey

    string

    续传文件的唯一标识,由服务端返回,只读的

    loaded

    number类型

    已经上传了的总大小,只读的

    xhr

    XMLHttpRequest类型

    发送数据的请求对象,只读的

    hasError

    布尔值

    是否发生了错误,只读的

    count

    number类型

    文件切片的总数,只读的

    index

    number类型

    当前正在上传的数据块索引,只读的

    paused

    布尔值

    当前是否为停止状态,只读的

     

    方法

     

    名称

    描述说明

    pause

    停止正在上传的文件,同时改变paused属性值,并抛出Uploader.ErrorType.UserAbort 类型的异常,将会触发pause事件

    proceed

    继续上传,如果当前已经正在上传,那么将得到 Uploader.ErrorType.InvalidOperation类型的异常信息,将会触发proceed事件

    cancel

    取消上传文件,如果sliced=true,那么将向服务端发送{ method: "deleteResumable", resumableKey: resumableKey } 信息,通知服务端上传已经上传的数据块,如果成功取消,将会触发cancel事件

     

    例子:

     

    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

        <title>超大文件上传</title>

        <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=1.0, user-scalable=no" />

        <script src="Scripts/jquery-2.1.1.min.js"></script>

        <script src="Scripts/Uploader.release.min.js"></script>

    </head>

    <body>

        <br />

        <a href="#" id="btn">select files</a><br /> 

        <input id="m" type="file" />

        <a href="javascript:" id="up">upload</a>

        

        <script>

            $("#up").click(function () {

               $("#m").asyncUploadFiles({ url: "Handler1.ashx" }, { complete: function (f,e) { alert(f.name+"上传已经完成!") }});

            });

            var uploader = new Uploader({

                placeholder: "#btn", url: "Handler1.ashx"//,limitSize:1024*1024*50

               , dragable: true//,dragContainer:$("#kk")

            });

        </script>

    </body>

    </html>

     

     

    ASP.NET 控件与提供程序

     

    提供程序的主要类

    FilesUploadHandler                       文件上传服务端处理程序

    ResumableInfoProvider                可续传信息提供程序抽象类,续传信息管理的基类

    ResumableInfoXmlProvider          XML续传信息提供程序,将可续传信息存储在XML文档中,是当前处理的默认提供程序。

     

    FilesUploadHandler   实现了IHttpHandler IDisposable 接口

     

    主要方法

    名称

    返回类型

    描述说明

    虚拟  CreateStorePath

    返回表示一个可用路径的字符串

    其重载版本要提供一个目录路径

    虚拟 Init

    没有返回值

    其派生类可以重写此方法来绑定事件

    IsValidation

    布尔值

    表示指定的上传文件是否合法,此方法将会触发Validate事件

    虚拟 Save

    IEnumerable<FileUploadComplete>

    返回已经处理完成的文件列表信息,此列表将以JSON的格式响应到客户端。

    虚拟 SaveFile

    FileUploadComplete

    保存指定的文件,并返回完成信息。

    虚拟 SaveResumableInfo

    没有返回值

    保存指定的可续传信息

    虚拟 RemoveResumableInfo

    没有返回值

    移除指定的可续传信息

    虚拟DeleteResumable

    没有返回值

    接收到客户端的取消通知时将调用此方删除已经保存的数据块。

     

    主要属性

    名称

    类型

    描述说明

    虚拟 Provider

    ResumableInfoProvider

    可续传信息管理的基类,默认是ResumableInfoXmlProvider,可以在派生类可以返回其他的提供程序,如:存储在SQL的提供程序等。

    Sliced

    布尔值

    是否当前上传的文件是否为超大文件中的一个切片。

    BlobIndex

    long

    当前数据块的索引

    BlobSize

    Long

    超大文件已被分割的数据块总数

    FileSize

    Long

    文件的总大小

    ResumableKey

    GUID

    可续传信息的唯一标识

    FileName

    String

    客户端提交的文件名称

    FileType

    String

    文件的类型

    ResumableInfo

    ResumableInfo

    可续传信息,如果文件是首次上传那么将会新建一个可续传信息。

    HasFiles

    Bool

    客户端是否提交有文件

    IsAuthenticated

    Bool

    当前用户是否已经授权。

    Token

    String

    只读的,客户端提交的票据以防止CSRF攻击,但需要手动验证。

     

    事件

    名称

    委托

    描述说明

    Error

    Action<FilesUploadHandler, Exception>

    抛出一个未处理的异常时触发。

    Complete

     Action<FilesUploadHandler, CompleteArguments>

    当上传的文件处理完成时触发。

    Validate

    Action<FilesUploadHandler, ValidateArguments>

    当验证一个文件是否有效时触发。

     

     

    客户端控件类

    Html5UploaderClient                     输出脚本代码和html视图

     

    公共属性

    名称

    类型

    描述说明

    ViewTemplate

    ITemplate

    视图模板,可以放置任何HTML元素或者ASP.NET控件,可选的

    ClientEvents

    ClientEventsCollection

    客户端事件集合,例如:

    <cc1:Html5UploaderClient ID="Html5Uploader1" RegisterScript="false" runat="server">

             <ClientEvents>

                <cc1:ClientEvent EventName="success" Handle="function(file,arg){ js  coding... }" />

                 <cc1:ClientEvent EventName="complete" Handle="completeFunction" />

                 <cc1:ClientEvent EventName="progress" Handle="javascript: js coding... " />

             </ClientEvents>

            </cc1:Html5UploaderClient>

    注意Handle包含了三种格式,这三种格式都是合法的。

    PostParameters

    PostParametersCollection

    提交到服务端处理程序的自定义参数集合,例如:

    <cc1:Html5UploaderClient ID="Html5Uploader1" RegisterScript="false" runat="server">

            <PostParameters>

                <cc1:PostParameter Key="param1" Value="value1" />

                <cc1:PostParameter Key="param2" Value="value2" />

            </PostParameters>

            </cc1:Html5UploaderClient>

     

    Token

    String

    读取或设置长度不超过50的动态票据,如果设置了该属性就需要在服务端手动验证以防止CSRF攻击。

    Url

    string

    服务端处理程序的路径

    Placeholder

    string

    打开文件选择器的占位符,例如:

    Placeholder="#btnSelectFiles" 或者 Placeholder="$:$('#btnSelectFiles')" 这两种格式都是合法的

    Multiple

    布尔值

    文件选择器对话框是否支持多选,默认值true

    Accept

    string类型

    接受的文件类型,默认值是空的,即是接受全部类型,例如:"image/*,video/*" 接受所有图片和视频文件

    Types

    string类型

    允许上传的的文件类型,在上传文件之前通过此类型类别验证文件的扩展名,这个类型应该与上面的accept尽量对应,例如:accept="image/jpeg,image/gif,image/png" 那么验证类型列表types应该是".jpg;.gif;.png" 这个是客户端验证的类型列表,但在服务端也要应该做同样的验证。

    Timeout

    string类型

    超时设置,默认是0,没有设置,格式为:数字+(ms|ss|mm|hh,例如:1000ms 表示1000毫秒,10hh 表示10小时,默认单位是秒,如:Timeout="60" 表示60秒后超时。

    MaxQueue

    int

    最大的队列数,默认是2,即是同时上传2个文件,如果超过2个文件,那么其他文件将在队列中等候,例如:您上传4个文件,那么前2个文件开始上传,其余的两个文件将在队列中等候直到队列中有其他文件完成了才开始上传。

    Dragable

    布尔值

    是否可以拖拽文件上传,默认是未开启的

    DragContainer

    string

    文件拖拽入的容器,默认是body,如:

    dragContainer="#container"  或者 dragContainer="$:$('#container' )"

    Progress

    string

    文件上传进度列表容器,如:

    Progress="#progressList" ,Progress="$:$('#progressList' )"

    BlobSize

    string

    文件切片上传时,单个数据块的大小,例如:BlobSize="4MB" 或者 "332KB" 或者 "1GB" 都是可以的

    Sliced

    UploaderSliceds枚举类型

    是否支持切片上传可用值:Auto,Enabled,Disabled 默认值 Auto

    LimitSize

    string

    上传文件大小限制,单位是字节,默认值0 表示没有限制,例如:LimitSize="4MB" 或者 "332KB" 或者 "23GB" 都是可以的

    ParseResult

    string

    客户端函数用来解析服务端返回的结果集 返回值是object如果服务端有错误应该返回{err:true,msg:“错误描述”}的对象

    RegisterScript

    bool

    是否注册客户端脚本,默认是true,如果您在模板里面添加了脚本,那么您可以把它设为fase

     

     

    例子:

     

     

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

    <%@ Register assembly="Html5Uploader" namespace="Html5Uploader.Controls" tagprefix="cc1" %>

    <!DOCTYPE html>

     

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head runat="server">

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

        <title></title>

        <script src="Scripts/jquery-2.1.1.min.js"></script>

        <script src="Scripts/Uploader.js"></script>

    </head>

    <body>

            <cc1:Html5UploaderClient ID="Html5Uploader1" RegisterScript="false" Url="Handler1.ashx" Placeholder="#btnSeletor" Accept="image/*,video/*" runat="server">

            <ViewTemplate>

                <a href="javascript:" id="btnSeletor" >select files</a>

            </ViewTemplate>

            <ClientEvents>

               <cc1:ClientEvent EventName="complete" Handle="javascript:alert(file.name+'上传已经完成!')" />

            </ClientEvents>

            <PostParameters>

                <cc1:PostParameter Key="param1" Value="value1" />

                <cc1:PostParameter Key="param2" Value="value2" />

            </PostParameters>

            </cc1:Html5UploaderClient>

    </body>

    </html>

     

     

     

    异常

     

    当提交的数据包与可续传信息不匹配时,服务器端上传处理程序将此异常定性为POST攻击,并抛出InvalidDataBlobException异常,其他安全检查建议Validate事件中检查,如:最大上传限制、文件类型检查、动态票据Token验证等等。

     

     

    客户端与服务端的合约

     

    1.服务端应该返回json格式的字符串,服务端应该处理500错误,发生错误应该返回'{"err:true,"msg":"错误描述"}' 或者 '{"error":true,"message":"错误描述"}' 告诉客户端发生了什么。

     

    2.客户端获取续传信息时提交{method:"getResumableInfo",fileType:string,fileName:string,fileSize:number,blobSize: number,blobCount:number} 数据,服务端要实现getResumableInfo方法根据提交的信息查找续传信息,并返回'{"key":"文件续传信息唯一标识","index":"最后一次上传的数据块索引"}',当关闭可续传功能时可以忽略此合约,或者在客户端捕捉“getResumableInfoHandler”事件更改合约实现自定义合约,但事件的callback函数应该要返回{key:"文件续传信息唯一标识",index:number} 类型的JS对象,详情请参照getResumableInfoHandler事件。

     

     

    关于开发版的一些小技巧

     

    如果您使用的是开发版的脚本代码,而您又不太熟悉Uploader对象的使用方法,那么您可以通过以下方法获得帮助:

     

    1.调用构造函数获取settings 配置说明的帮助,如:

     

    <script>

    Uploader();  //将会输出帮助信息到控制台,打开浏览器的控制台即可获得配置说明的帮助

    </script>

     

    2.调用on函数获取事件绑定帮助信息,如:

     

    <script>

    var  instance= new   Uploader();

    instance.on();

     //将会输出帮助信息到控制台,打开浏览器的控制台即可获得事件绑定帮助信息

    </script>

     

     

    演示下载

     

    http://download.csdn.net/detail/j_honghai/7810289

     

     

     

     

     
  • 相关阅读:
    selenium2基本控件介绍及其代码
    selenium2元素定位Xpath和cssSelector
    Selenium2启动浏览器且加载插件
    bash之条件测试if/else
    bash脚本编写基础
    Android后台的linux一直保持唤醒状态,不进入睡眠
    Linux任务计划、周期性任务执行
    C#进阶系列——WebApi 跨域问题解决方案:CORS(转载)
    linq group by
    echart 分组属性
  • 原文地址:https://www.cnblogs.com/Jackson-Bruce/p/3932737.html
Copyright © 2011-2022 走看看