婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > HTML5+WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例

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

熱門標(biāo)簽:電視購物電銷外呼系統(tǒng) 百應(yīng)電銷機(jī)器人產(chǎn)業(yè) 貸款電銷人工和機(jī)器人哪個(gè)好 電話機(jī)器人如何 聯(lián)通400電話申請(qǐng) 杭州營(yíng)銷電銷機(jī)器人供應(yīng)商 西寧智能外呼系統(tǒng)加盟 飛亞外呼系統(tǒng) 高德地圖標(biāo)注賓館位置

在傳統(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)行文件的傳輸就變得更加方便和靈活.下面通過使用HTML5結(jié)合websocet簡(jiǎn)單地實(shí)現(xiàn)多文件同時(shí)上傳應(yīng)用.

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

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

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

FileInfo類封裝

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

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);

        }

    });

 

} 

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

文件拖放

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

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ān)拖放文件即可,這些可能通過一些HTML5的教程可以得到幫助。

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

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);

                }

            }

        } 

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

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)單了

/// <summary>

    /// Copyright © henryfan 2012        

    ///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來處理上傳的信息,所以文件流要進(jìn)行一個(gè)base64的編碼處理,由于websocket瀏覽提交的數(shù)據(jù)一般都有MASK處理再加上base64那損耗相對(duì)來說比較重,實(shí)際上websocket有提供流的數(shù)據(jù)包格式(arraybuffer);當(dāng)然這種處理在操作上就沒有json來得方便簡(jiǎn)單.

下載代碼:WebSocketUpload.rar  

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:安慶 牡丹江 內(nèi)蒙古 煙臺(tái) 晉中 玉溪 撫州 邯鄲

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《HTML5+WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例》,本文關(guān)鍵詞  HTML5+WebSocket,實(shí)現(xiàn),多,文件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《HTML5+WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于HTML5+WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲精品在线免费播放| 欧美精品在线一区二区| 亚洲精品日日夜夜| 波多野结衣中文一区| 婷婷综合久久一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 亚洲国产精品精华液网站| 99re8在线精品视频免费播放| 国产精品99久久久久久久vr| 日韩精品每日更新| 水蜜桃久久夜色精品一区的特点| 亚欧色一区w666天堂| 91极品视觉盛宴| 91麻豆国产精品久久| 99久久99精品久久久久久| 99久久久免费精品国产一区二区| 99视频精品全部免费在线| 色老综合老女人久久久| 欧美日韩国产片| 日韩一区二区三区观看| 久久综合狠狠综合久久综合88 | 日韩美女一区二区三区四区| 日韩一区二区免费视频| 精品国产免费人成电影在线观看四季| 久久色.com| 日韩欧美激情一区| 久久久久久久网| 亚洲欧美日韩在线不卡| 亚洲午夜久久久久中文字幕久| 首页国产欧美日韩丝袜| 精品一区精品二区高清| www.在线成人| 欧美精选一区二区| 国产午夜精品美女毛片视频| 亚洲一线二线三线视频| 欧美aⅴ一区二区三区视频| 国产黄人亚洲片| 色播五月激情综合网| 日韩一区二区三区观看| 国产精品久久久久久久久图文区| 亚洲国产精品一区二区www在线| 麻豆精品视频在线观看免费| 99re热这里只有精品视频| 欧美一区二区三区免费视频| 中文一区在线播放| 蜜桃久久久久久| 91丨porny丨国产入口| 精品国产一区二区三区忘忧草| 成人欧美一区二区三区白人| 日韩高清一级片| 天堂影院一区二区| 岛国精品在线观看| 日韩欧美一区中文| 亚洲午夜精品网| 成人app网站| 国产偷v国产偷v亚洲高清| 日韩国产高清在线| 欧美中文字幕久久| 国产精品灌醉下药二区| 国产精品1区2区3区在线观看| 欧美一区二区三区人| 亚洲国产精品视频| 色综合久久综合| 日本一区二区高清| 亚洲国产日韩一区二区| 99久久婷婷国产精品综合| 久久久五月婷婷| 六月丁香婷婷久久| 91精品在线免费| 午夜免费久久看| 欧美在线一区二区| 亚洲婷婷国产精品电影人久久| 国产一区二区三区香蕉| 欧美一区二区三区婷婷月色| 性做久久久久久久久| 在线观看亚洲精品| 一区二区视频在线看| 丁香另类激情小说| 国产亚洲人成网站| 亚洲国产日韩a在线播放性色| 91首页免费视频| 亚洲理论在线观看| 色香蕉成人二区免费| 欧美成人一区二区| 无码av中文一区二区三区桃花岛| 日本二三区不卡| 久久一日本道色综合| 精品无人码麻豆乱码1区2区| 精品播放一区二区| 国产一区二区h| 久久尤物电影视频在线观看| 国产成人在线网站| 久久精品久久99精品久久| 中文字幕一区二区三区av| 久久99精品国产麻豆婷婷| 色综合久久久久| 亚洲一区欧美一区| eeuss鲁片一区二区三区| 免费在线观看视频一区| 亚洲国产欧美日韩另类综合| 在线免费av一区| 91精品国产综合久久福利软件| 911精品国产一区二区在线| 精品福利视频一区二区三区| 在线精品视频免费观看| 狠狠狠色丁香婷婷综合激情| 免费看日韩精品| 免费成人在线影院| 亚洲综合网站在线观看| 国产一区二区三区蝌蚪| 一区二区在线免费| 亚洲精品日韩综合观看成人91| 国产精品久久三| 精品亚洲porn| 五月婷婷激情综合网| 久久精品在线免费观看| 久久综合成人精品亚洲另类欧美 | 欧美不卡一二三| 成人在线视频一区二区| 国产亚洲一二三区| 在线观看www91| 久久se精品一区二区| 欧美国产日韩亚洲一区| 欧美日韩综合色| 国产麻豆一精品一av一免费 | 国产三级精品三级在线专区| eeuss影院一区二区三区| 亚洲午夜电影在线| 欧美va亚洲va在线观看蝴蝶网| 秋霞电影一区二区| 亚洲品质自拍视频| 精品国产乱码久久久久久浪潮| av电影在线观看完整版一区二区| 午夜日韩在线观看| 国产精品萝li| 精品国产乱码久久久久久久久| 色呦呦网站一区| 国产综合色产在线精品| 亚洲欧美视频一区| 国产亚洲综合在线| 精品久久国产字幕高潮| 日韩三级在线观看| 日韩欧美专区在线| 欧美刺激脚交jootjob| 精品日韩成人av| 久久理论电影网| 国产亲近乱来精品视频 | 亚洲精品一区二区三区蜜桃下载| 欧美一区二区在线播放| 日韩精品一区二区三区老鸭窝| 日韩欧美视频一区| 国产精品不卡一区| 国产精品国产三级国产aⅴ中文| 成人欧美一区二区三区黑人麻豆| 亚洲精品精品亚洲| 亚洲福利一二三区| 美女被吸乳得到大胸91| 国产精品综合网| 99久久国产综合色|国产精品| 91在线观看免费视频| 欧美私人免费视频| 精品国产伦一区二区三区免费| 日本一二三不卡| 亚洲国产精品人人做人人爽| 麻豆一区二区三区| 99久久er热在这里只有精品15| 欧美视频第二页| 精品99一区二区| 亚洲欧美一区二区三区久本道91| 亚洲国产日韩综合久久精品| 久久99精品久久久| 91亚洲国产成人精品一区二三| 欧美视频一区在线观看| 欧美mv日韩mv亚洲| 亚洲视频一区二区在线观看| 天堂一区二区在线免费观看| 国产精品综合在线视频| 色天天综合色天天久久| 日韩亚洲欧美中文三级| 亚洲国产精品99久久久久久久久| 亚洲永久免费视频| 国产成人精品www牛牛影视| 欧美亚洲日本一区| 久久人人爽人人爽| 香蕉久久一区二区不卡无毒影院 | 国产欧美视频一区二区| 亚洲免费观看高清完整版在线| 精品一区二区三区在线观看| 成人sese在线| 精品久久久网站| 亚洲成人自拍一区| 99视频超级精品| 欧美精品一区二区在线观看| 亚洲国产wwwccc36天堂| 99久久精品费精品国产一区二区| 日韩一二在线观看| 亚洲一区二区av电影| av电影在线观看完整版一区二区| 日韩一区二区在线播放| 亚洲最新视频在线观看|