pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5-WebSocket實(shí)現(xiàn)多文件同時(shí)上傳

HTML5提供一系列的AIP進(jìn)行文件讀取,包括計(jì)取文件某一塊的內(nèi)容也非常方便,結(jié)合Websocket進(jìn)行文件的傳輸就變得更加方便和靈活,下面通過(guò)使用HTML5結(jié)合websocet簡(jiǎn)單地實(shí)現(xiàn)多文件同時(shí)上傳

       在傳統(tǒng)的HTTP應(yīng)用上傳文件想要同時(shí)上傳多個(gè)文件并查看上傳進(jìn)度是一件很麻煩的事情,當(dāng)然現(xiàn)在也有一些基于SWF的文件上傳組件提供這種的便利性.到了HTML5下對(duì)文件的讀取和上傳的控制方面就非常靈活,HTML5提供一系列的AIP進(jìn)行文件讀取,包括計(jì)取文件某一塊的內(nèi)容也非常方便,結(jié)合Websocket進(jìn)行文件的傳輸就變得更加方便和靈活.下面通過(guò)使用HTML5結(jié)合websocet簡(jiǎn)單地實(shí)現(xiàn)多文件同時(shí)上傳應(yīng)用。

實(shí)現(xiàn)功能


大概預(yù)覽一下需要做的功能:



主要功能是用戶(hù)可以直接把文件夾的文件直接拖放到網(wǎng)頁(yè)中,并進(jìn)行上傳,在上傳的過(guò)程中顯示上傳進(jìn)度信息.


FileInfo類(lèi)封裝


為了方便讀取文件信息,在原有File的基礎(chǔ)封裝了一個(gè)簡(jiǎn)單文件信息讀取的對(duì)象類(lèi).


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
function FileInfo(file, pagesize) {
    this.Size = file.size;
    this.File = file;
    this.FileType = file.type;
    this.FileName = file.name;
    this.PageSize = pagesize;
    this.PageIndex = 0;
    this.Pages = 0;
    this.UploadError = null;
    this.UploadProcess = null;
    this.DataBuffer = null;
    this.UploadBytes = 0;
    this.ID = Math.floor(Math.random() * 0x10000).toString(16);
    this.LoadCallBack = null;
    if (Math.floor(this.Size % this.PageSize) > 0) {
        this.Pages = Math.floor((this.Size / this.PageSize)) + 1;
  
    }
    else {
        this.Pages = Math.floor(this.Size / this.PageSize);
  
    }
  
}
FileInfo.prototype.Reset = function () {
    this.PageIndex = 0;
    this.UploadBytes = 0;
}
FileInfo.prototype.toBase64String = function () {
    var binary = ''
    var bytes = new Uint8Array(this.DataBuffer)
    var len = bytes.byteLength;
  
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode(bytes[i])
    }
    return window.btoa(binary);
}
FileInfo.prototype.OnLoadData = function (evt) {
    var obj = evt.target["tag"];
  
    if (evt.target.readyState == FileReader.DONE) {
        obj.DataBuffer = evt.target.result;
        if (obj.LoadCallBack != null)
            obj.LoadCallBack(obj);
  
    }
    else {
        if (obj.UploadError != null)
            obj.UploadError(fi, evt.target.error);
    }
  
}
  
FileInfo.prototype.Load = function (completed) {
    this.LoadCallBack = completed;
    if (this.filereader == null || this.filereader == undefined)
        this.filereader = new FileReader();
    var reader = this.filereader;
    reader["tag"] = this;
    reader.onloadend = this.OnLoadData;
    var count = this.Size - this.PageIndex * this.PageSize;
    if (count > this.PageSize)
        count = this.PageSize;
    this.UploadBytes += count;
    var blob = this.File.slice(this.PageIndex * this.PageSize, this.PageIndex * this.PageSize + count);
  
    reader.readAsArrayBuffer(blob);
};
  
FileInfo.prototype.OnUploadData = function (file) {
    var channel = file._channel;
    var url = file._url;
    channel.Send({ url: url, parameters: { FileID: file.ID, PageIndex: file.PageIndex, Pages: file.Pages, Base64Data: file.toBase64String()} }, function (result) {
        if (result.status == null || result.status == undefined) {
            file.PageIndex++;
            if (file.UploadProcess != null)
                file.UploadProcess(file);
            if (file.PageIndex < file.Pages) {
                file.Load(file.OnUploadData);
            }
        }
        else {
  
            if (file.UploadError != null)
                file.UploadError(file, data.status);
        }
    });
}
  
FileInfo.prototype.Upload = function (channel, url) {
    var fi = this;
    channel.Send({ url: url, parameters: { FileName: fi.FileName, Size: fi.Size, FileID: fi.ID} }, function (result) {
        if (result.status == null || result.status == undefined) {
            fi._channel = channel;
            fi._url = result.data;
            fi.Load(fi.OnUploadData);
        }
        else {
            if (file.UploadError != null)
                file.UploadError(fi, result.status);
        }
    });
  
}


類(lèi)的處理很簡(jiǎn)單,通過(guò)file初始化并指定分塊大小來(lái)實(shí)始化一些文件信息,如頁(yè)數(shù)量頁(yè)大小等.當(dāng)然最重要還封裝文件對(duì)應(yīng)的Upload方法,用于把文件塊信息打包成base64信息通過(guò)Websocket的方式發(fā)送到服務(wù)器。


文件拖放


在HTML5中接受系統(tǒng)文件拖放進(jìn)來(lái)并不需要做復(fù)雜的事情,只需要針對(duì)容器元素綁定相關(guān)事件即可.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function onDragEnter(e) {
            e.stopPropagation();
            e.preventDefault();
        }
  
        function onDragOver(e) {
            e.stopPropagation();
            e.preventDefault();
            $(dropbox).addClass('rounded');
        }
  
        function onDragLeave(e) {
            e.stopPropagation();
            e.preventDefault();
            $(dropbox).removeClass('rounded');
        }
  
        function onDrop(e) {
            e.stopPropagation();
            e.preventDefault();
            $(dropbox).removeClass('rounded');
            var readFileSize = 0;
            var files = e.dataTransfer.files;
            if (files.length > 0) {
                onFileOpen(files);
            }
  
        }


只需要在onDrop過(guò)程中獲取相關(guān)拖放文件即可,這些可能通過(guò)一些HTML5的教程可以得到幫助,詳細(xì)看http://www.html5rocks.com/zh/tutorials/file/dndfiles/


這時(shí)候只需要針對(duì)選擇的文件構(gòu)建相關(guān)FileInfo對(duì)象,并調(diào)用上傳方法即可.


1
2
3
4
5
6
7
8
9
10
function onFileOpen(files) {
            if (files.length > 0) {
                for (var i = 0; i < files.length; i++) {
                    var info = new FileInfo(files[i], 32768);
                    uploads.push(info);
                    info.UploadProcess = onUploadProcess;
                    addUploadItem(info);
                }
            }
        }


通過(guò)UploadProcess事件對(duì)上傳文件進(jìn)度信息進(jìn)行一個(gè)設(shè)置更新


1
2
3
4
5
function onUploadProcess(file) {
            $('#p_' + file.ID).progressbar({ value: (file.PageIndex / file.Pages) * 100,
                text: file.FileName + '[' + file.UploadBytes + '/' + file.Size + ']'
            });
        }


C#服務(wù)端


借助于Beetle對(duì)websocket的支持對(duì)應(yīng)服務(wù)端的實(shí)現(xiàn)就非常簡(jiǎn)單了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
    /// Copyright ? henryfan 2012        
    ///Email:   henryfan@msn.com    
    ///HomePage:    http://www.ikende.com       
    ///CreateTime:  2012/12/14 21:13:34
    /// </summary>
    public class Handler
    {
        public void UploadPackage(string FileID, int PageIndex, int Pages, string Base64Data)
        {
            Console.WriteLine("FileID:{2},PageIndex:{0} Pages:{1} DataLength:{3}", PageIndex, Pages, FileID,Base64Data.Length);
  
        }
        public string UploadFile(string FileID, string FileName, long Size)
        {
            Console.WriteLine("FileID:{2},FileName:{0} Size:{1}", FileName, Size, FileID);
            return "Handler.UploadPackage";
        }
    }


服務(wù)端方法有兩個(gè)一個(gè)是上傳文件請(qǐng)求,和一個(gè)上傳文件塊接收方法。


總結(jié)


只需要以上簡(jiǎn)單的代碼就能實(shí)現(xiàn)多文件同時(shí)上傳功能,在這采用json來(lái)處理上傳的信息,所以文件流要進(jìn)行一個(gè)base64的編碼處理,由于websocket瀏覽提交的數(shù)據(jù)一般都有MASK處理再加上base64那損耗相對(duì)來(lái)說(shuō)比較重,實(shí)際上websocket有提供流的數(shù)據(jù)包格式(arraybuffer);當(dāng)然這種處理在操作上就沒(méi)有json來(lái)得方便簡(jiǎn)單。


下載代碼:WebSocketUpload.rar (642.65 kb) 


演示地址:http://html5.ikende.com/upload.htm 使用chrome或IE10瀏覽器

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

由于實(shí)際運(yùn)行環(huán)境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會(huì)達(dá)到,所以這部分不是開(kāi)發(fā)者能夠決定的,開(kāi)發(fā)者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個(gè)自定義的視頻播放器,需要用到HTML5提供的video標(biāo)簽、以及HTML5提供的對(duì)JavascriptAPI的擴(kuò)展。,HTML5中國(guó),中國(guó)最大的HTML5中文門(mén)戶(hù)。
隨著 Hybrid 應(yīng)用的豐富,HTML5 工程師們已經(jīng)不滿(mǎn)足于把桌面端體驗(yàn)簡(jiǎn)單移植到移動(dòng)端,他們覬覦移動(dòng)原生應(yīng)用人性化的操作體驗(yàn),特別是原生應(yīng)用與生俱來(lái)的豐富的手勢(shì)系統(tǒng)。HTML5 沒(méi)有提
你想要在自己網(wǎng)站上分享一個(gè)產(chǎn)品,或者是一個(gè)作品集,又或者僅僅只是一個(gè)靈感。在你發(fā)布到網(wǎng)上之前,你想讓它看起來(lái)有吸引力,專(zhuān)業(yè),或者至少得看起來(lái)像那么回事。那么你接下
H5廣告,包括H5廣告的設(shè)計(jì)流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專(zhuān)門(mén)做了一個(gè)講義。同時(shí),也讓我意外的收到了非常好反饋和認(rèn)!這是對(duì)我的極大鼓勵(lì)!我的
本文主要內(nèi)容有:框架與組件、構(gòu)建生態(tài)、開(kāi)發(fā)技巧與調(diào)試、html、css與重構(gòu)、native/hybrid/桌面開(kāi)發(fā)、前端/H5優(yōu)化、全棧/全端開(kāi)發(fā)、研究實(shí)驗(yàn)、數(shù)據(jù)分析與監(jiān)控、其它軟技能、前端技術(shù)網(wǎng)
主站蜘蛛池模板: 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 长沙广告公司|长沙广告制作设计|长沙led灯箱招牌制作找望城湖南锦蓝广告装饰工程有限公司 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 富森高压水枪-柴油驱动-养殖场高压清洗机-山东龙腾环保科技有限公司 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 淘剧影院_海量最新电视剧,免费高清电影随心观看 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 包头市鑫枫装饰有限公司| 水热合成反应釜-防爆高压消解罐-西安常仪仪器设备有限公司 | 好杂志网-首页| 康明斯发电机,上柴柴油发电机,玉柴柴油发电机组_海南重康电力官网 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | 万家财经_财经新闻_在线财经资讯网 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 粉碎机_塑料粉碎机_塑料破碎机厂家-星标机械 | 江苏齐宝进出口贸易有限公司 | 福尔卡(北京)新型材料技术股份有限公司 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 | 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | 圆周直径尺-小孔内视镜-纤维研磨刷-东莞市高腾达精密工具 | 路面机械厂家| 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 首页-浙江橙树网络技术有限公司| 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 |