欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > HTML5+WebSocket實現多文件同時上傳的實例

HTML5+WebSocket實現多文件同時上傳的實例

熱門標簽:電視購物電銷外呼系統 百應電銷機器人產業 貸款電銷人工和機器人哪個好 電話機器人如何 聯通400電話申請 杭州營銷電銷機器人供應商 西寧智能外呼系統加盟 飛亞外呼系統 高德地圖標注賓館位置

在傳統的HTTP應用上傳文件想要同時上傳多個文件并查看上傳進度是一件很麻煩的事情,當然現在也有一些基于SWF的文件上傳組件提供這種的便利性.到了HTML5下對文件的讀取和上傳的控制方面就非常靈活,HTML5提供一系列的AIP進行文件讀取,包括計取文件某一塊的內容也非常方便,結合Websocket進行文件的傳輸就變得更加方便和靈活.下面通過使用HTML5結合websocet簡單地實現多文件同時上傳應用.

實現功能

大概預覽一下需要做的功能:

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

FileInfo類封裝

為了方便讀取文件信息,在原有File的基礎封裝了一個簡單文件信息讀取的對象類.

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

        }

    });

 

} 

類的處理很簡單,通過file初始化并指定分塊大小來實始化一些文件信息,如頁數量頁大小等.當然最重要還封裝文件對應的Upload方法,用于把文件塊信息打包成base64信息通過Websocket的方式發送到服務器.

文件拖放

在HTML5中接受系統文件拖放進來并不需要做復雜的事情,只需要針對容器元素綁定相關事件即可.

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過程中獲取相關拖放文件即可,這些可能通過一些HTML5的教程可以得到幫助。

這時候只需要針對選擇的文件構建相關FileInfo對象,并調用上傳方法即可.

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事件對上傳文件進度信息進行一個設置更新

function onUploadProcess(file) {

            $('#p_' + file.ID).progressbar({ value: (file.PageIndex / file.Pages) * 100,

                text: file.FileName + '[' + file.UploadBytes + '/' + file.Size + ']'

            });

        } 

C#服務端

借助于Beetle對websocket的支持對應服務端的實現就非常簡單了

/// <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";

        }

    } 

服務端方法有兩個一個是上傳文件請求,和一個上傳文件塊接收方法.

總結

只需要以上簡單的代碼就能實現多文件同時上傳功能,在這采用json來處理上傳的信息,所以文件流要進行一個base64的編碼處理,由于websocket瀏覽提交的數據一般都有MASK處理再加上base64那損耗相對來說比較重,實際上websocket有提供流的數據包格式(arraybuffer);當然這種處理在操作上就沒有json來得方便簡單.

下載代碼:WebSocketUpload.rar  

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:安慶 牡丹江 內蒙古 煙臺 晉中 玉溪 撫州 邯鄲

巨人網絡通訊聲明:本文標題《HTML5+WebSocket實現多文件同時上傳的實例》,本文關鍵詞  HTML5+WebSocket,實現,多,文件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《HTML5+WebSocket實現多文件同時上傳的實例》相關的同類信息!
  • 本頁收集關于HTML5+WebSocket實現多文件同時上傳的實例的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    色诱视频网站一区| 亚洲小说春色综合另类电影| 久久er99热精品一区二区| 国产精品无码一区二区三| 在线免费观看日本一区| 综合av第一页| 成人深夜福利app| 免费中文字幕日韩| 国产精品蜜臀av| 国产盗摄一区二区三区| 2017亚洲天堂| 日本一二三不卡| 成人免费毛片app| 色呦呦一区二区三区| 亚洲人成在线观看一区二区| proumb性欧美在线观看| 一本色道a无线码一区v| 一区在线观看免费| 91香蕉国产在线观看软件| 欧美性大战久久久久久久蜜臀 | 一区二区伦理片| 久久欧美一区二区| 国产福利一区二区三区视频| 四虎884aa成人精品| 自拍偷自拍亚洲精品播放| 99国产精品国产精品久久| 91福利国产成人精品照片| 一区二区三区精品久久久| 无码人妻丰满熟妇区毛片蜜桃精品 | 99久久精品国产网站| 欧美三级日韩在线| 亚洲成人动漫av| 国产aⅴ激情无码久久久无码| 久久影院视频免费| 处破女av一区二区| 欧美性大战久久久久久久| 亚洲不卡在线观看| 免费看污片网站| 国产欧美精品区一区二区三区 | 国内不卡的二区三区中文字幕| 国产精品18在线| 亚洲日本在线观看| 男女性杂交内射妇女bbwxz| 日韩午夜av电影| 国产盗摄女厕一区二区三区| 色婷婷亚洲精品| 天天操天天干天天综合网| 中文字幕被公侵犯的漂亮人妻| 久久嫩草精品久久久精品一| 成人激情av网| 欧美军同video69gay| 久久av老司机精品网站导航| 亚洲一级生活片| 天涯成人国产亚洲精品一区av| 女人又爽又黄免费女仆| 中文字幕日韩av资源站| 污污污www精品国产网站| 国产亚洲成年网址在线观看| 91亚洲精华国产精华精华液| 日韩欧美自拍偷拍| 豆国产96在线|亚洲| 欧美高清www午色夜在线视频| 久久精品国产精品亚洲红杏| 成人免费毛片东京热| 日韩精品五月天| 天天看天天摸天天操| 亚洲午夜久久久久| 人妻互换一区二区激情偷拍| 亚洲一区av在线| 日韩欧美在线视频播放| 亚洲va欧美va天堂v国产综合| 黄色一级片一级片| 亚洲成人精品在线观看| 99久久久免费精品| 首页综合国产亚洲丝袜| 精品国产乱码久久久久久鸭王1| 日本女人一区二区三区| 色综合中文字幕国产 | 国产一区在线观看免费| 亚洲第一精品在线| 182在线观看视频| 免费在线视频一区| 在线观看网站黄不卡| 国产激情91久久精品导航 | 99九九99九九九视频精品| 精品国产污污免费网站入口| 91在线国产观看| 久久久不卡网国产精品一区| 91丨porny丨对白| 亚洲女同一区二区| 欧美另类69xxxx| 日韩二区三区四区| 在线观看视频91| 国产很黄免费观看久久| 日韩欧美色电影| 动漫美女无遮挡免费| 亚洲欧美怡红院| 天堂在线中文视频| 日本系列欧美系列| 欧美精选一区二区| 91丨九色porny丨蝌蚪| 中文乱码免费一区二区| 国产精品无码久久久久一区二区| 亚洲一区二区三区三| 放荡的美妇在线播放| 国产精一区二区三区| 日韩欧美国产电影| 老司机午夜免费福利| 亚洲欧美日韩小说| 国产又粗又硬又长又爽| 国产麻豆精品theporn| 精品久久久久香蕉网| bl动漫在线观看| 亚洲国产精品久久久久婷婷884 | 久久黄色一级视频| 亚洲欧洲三级电影| 天天看天天摸天天操| 国产成人综合自拍| 欧美国产综合色视频| 精品人体无码一区二区三区| 久草中文综合在线| 欧美不卡视频一区| 国产精品三级在线观看无码| 日韩激情视频在线观看| 欧美久久久久久久久| 久草视频福利在线| 天堂蜜桃91精品| 91精品国产一区二区三区蜜臀| 性感美女一区二区三区| 亚洲一级二级三级| 欧美美女黄视频| 国产一卡二卡三卡四卡| 午夜电影一区二区三区| 884aa四虎影成人精品一区| 国产高潮视频在线观看| 日韩中文字幕1| 日韩女优电影在线观看| 中文字幕日韩三级片| 日本欧美在线看| 欧美大片拔萝卜| 五月天精品在线| 国产成人8x视频一区二区 | 成人丝袜18视频在线观看| ...xxx性欧美| 在线精品视频小说1| 影音先锋资源av| 丝袜亚洲另类丝袜在线| 日韩欧美国产三级电影视频| 欧美大波大乳巨大乳| 国产成人午夜精品5599| 亚洲视频一区在线观看| 欧美天天综合网| 亚洲欧美在线不卡| 黑人巨大精品欧美一区| 国产精品免费aⅴ片在线观看| 91久久人澡人人添人人爽欧美| 丰满熟女人妻一区二区三区| 视频一区欧美精品| 久久午夜免费电影| 日本韩国欧美在线| 国产精品123区| 亚洲三级在线免费观看| 69成人精品免费视频| 第一次破处视频| 成人18视频日本| 偷窥国产亚洲免费视频| 久久婷婷国产综合国色天香| 粉嫩av性色av蜜臀av网站| 日本xxxx免费| 蜜芽一区二区三区| 国产精品久线观看视频| 欧美三级视频在线| 性猛交ⅹxxx富婆video| heyzo一本久久综合| 性久久久久久久久久久久| 久久久青草青青国产亚洲免观| 国产十六处破外女视频| 娇妻高潮浓精白浆xxⅹ| 国产一区二区成人久久免费影院 | 亚洲成人生活片| 亚洲麻豆一区二区三区| 国内精品第一页| 一区二区三区**美女毛片| 日韩欧美电影一二三| 69xx绿帽三人行| 精品人妻少妇嫩草av无码| 成人app网站| 日本不卡高清视频| 中文字幕在线不卡国产视频| 日韩欧美久久一区| 色婷婷精品久久二区二区蜜臂av | 无码熟妇人妻av| av不卡在线播放| 麻豆传媒一区二区三区| 一区二区在线电影| 国产亚洲精品免费| 91精品国产一区二区三区 | 美女福利视频网| 好吊色视频一区二区三区| 成人福利视频在线看|