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

主頁 > 知識庫 > 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實現多文件同時上傳的實例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区三区在线影院| 欧美精品一区男女天堂| 91伊人久久大香线蕉| 精品一二线国产| 久久99精品国产麻豆不卡| 奇米影视一区二区三区小说| 午夜精品久久久久久久 | 中文字幕不卡在线观看| 欧美tk丨vk视频| 久久人人爽爽爽人久久久| 国产亚洲综合在线| 国产精品卡一卡二| 一区二区三区四区精品在线视频| 一区二区三区免费在线观看| 一区二区三区波多野结衣在线观看| 亚洲欧美日韩国产成人精品影院| 亚洲最新视频在线观看| 天天色天天操综合| 精品一区二区三区香蕉蜜桃| 国产suv精品一区二区三区| 99re热视频这里只精品| 欧美色精品在线视频| 欧美二区在线观看| 亚洲国产精品成人综合| 亚洲在线观看免费视频| 免费看精品久久片| 99久久精品一区二区| 欧美日韩精品一区二区三区| 精品免费日韩av| 亚洲免费av高清| 久久精品国产99久久6| 国产成人亚洲精品青草天美| 色欧美88888久久久久久影院| 欧美情侣在线播放| 国产精品久久毛片av大全日韩| 一卡二卡欧美日韩| 激情五月播播久久久精品| 色综合久久九月婷婷色综合| 日韩亚洲欧美高清| 亚洲美女精品一区| 国产伦精品一区二区三区视频青涩| 色婷婷综合久久久中文一区二区| 精品入口麻豆88视频| 亚洲自拍另类综合| 岛国精品一区二区| 日韩精品一区二区三区四区| 亚洲精品乱码久久久久久日本蜜臀| 日韩电影一二三区| 91国在线观看| 亚洲欧洲国产专区| 国产精品77777竹菊影视小说| 欧美日韩国产系列| 亚洲乱码国产乱码精品精的特点| 国产a精品视频| 日韩精品专区在线影院观看| 一区二区三区精密机械公司| 丁香啪啪综合成人亚洲小说| 欧美电影免费观看高清完整版| 亚洲精品欧美综合四区| 成人av资源站| 亚洲国产电影在线观看| 国产在线视视频有精品| 日韩女优毛片在线| 奇米精品一区二区三区四区| 91国产成人在线| 亚洲女人小视频在线观看| 成人综合婷婷国产精品久久| 26uuu亚洲| 精品一区二区精品| 久久精品视频在线看| 九色综合国产一区二区三区| 欧美日韩二区三区| 亚洲地区一二三色| 7777精品伊人久久久大香线蕉| 丝袜亚洲另类丝袜在线| 欧美日韩成人综合| 免费在线一区观看| 欧美www视频| 国产盗摄女厕一区二区三区| 国产喷白浆一区二区三区| 国产激情精品久久久第一区二区 | 欧美电视剧免费全集观看| 青青草97国产精品免费观看| 这里只有精品99re| 欧美a级理论片| 亚洲精品一线二线三线无人区| 国产自产2019最新不卡| 欧美国产一区二区在线观看| 99久久精品国产导航| 亚洲色图制服诱惑| 欧美猛男超大videosgay| 另类的小说在线视频另类成人小视频在线| 91精品久久久久久久99蜜桃| 麻豆91在线播放| 国产精品日日摸夜夜摸av| 99国产精品久久久久久久久久| 一区二区成人在线| 日韩午夜av一区| proumb性欧美在线观看| 亚洲成人av一区二区三区| 欧美xxxxx牲另类人与| 9i看片成人免费高清| 亚洲一区二区三区在线| 精品电影一区二区| 91麻豆6部合集magnet| 久久国产福利国产秒拍| 亚洲欧洲三级电影| 日韩一卡二卡三卡四卡| 成人av资源下载| 久草精品在线观看| 亚洲精品自拍动漫在线| 精品精品欲导航| 欧美伊人久久大香线蕉综合69| 久久99精品国产.久久久久久| 亚洲天堂av一区| 精品久久久久久综合日本欧美| 91极品视觉盛宴| 成人久久久精品乱码一区二区三区| 一区二区三区高清在线| 国产性做久久久久久| 在线成人高清不卡| 91老司机福利 在线| 国产呦精品一区二区三区网站| 亚洲在线视频网站| 1024成人网色www| 精品久久久久久久久久久久久久久久久 | 欧美亚洲动漫制服丝袜| 国产精品一区二区三区四区| 亚洲一级二级在线| 国产精品网曝门| 精品三级在线观看| 91精品国产91久久久久久一区二区| av电影在线观看一区| 国产麻豆精品视频| 精品一区二区三区在线播放视频| 天天操天天色综合| 亚洲丰满少妇videoshd| 亚洲精品免费电影| 亚洲女同女同女同女同女同69| 国产精品三级在线观看| 中文成人av在线| 26uuu国产日韩综合| 日韩一二三四区| 91精品婷婷国产综合久久竹菊| 欧美午夜影院一区| 99精品国产99久久久久久白柏| 久久99精品国产麻豆婷婷洗澡| 日韩av一区二区三区四区| 亚洲成人动漫av| 亚洲成人高清在线| 亚洲国产成人porn| 亚洲va国产天堂va久久en| 亚洲成人免费看| 秋霞成人午夜伦在线观看| 日本aⅴ免费视频一区二区三区| 亚洲成av人在线观看| 蜜臀av性久久久久蜜臀av麻豆| 蜜桃av一区二区| 国产在线精品一区在线观看麻豆| 久久精品国产一区二区三 | 欧美激情资源网| 中文字幕一区二区三区不卡| 亚洲欧洲精品天堂一级| 99久久er热在这里只有精品66| 男人的天堂久久精品| 国产成人精品亚洲777人妖| 国产精品一线二线三线精华| 日本欧洲一区二区| 美女www一区二区| 韩国精品免费视频| 99精品视频在线播放观看| 91久久一区二区| 欧美一区二区三区四区五区| 欧美一级爆毛片| 中文字幕va一区二区三区| 亚洲男女毛片无遮挡| 肉色丝袜一区二区| 国产一区二三区| 91免费国产视频网站| 日韩欧美中文字幕公布| 欧美激情在线一区二区三区| 亚洲精品福利视频网站| 蜜臀精品一区二区三区在线观看 | 在线免费一区三区| 欧美va天堂va视频va在线| 日韩伦理电影网| 久久精品国产秦先生| 日本韩国精品在线| 亚洲精品一区二区三区影院| 一区二区三区日本| 成人一级片在线观看| 91麻豆精品国产自产在线观看一区 | 91性感美女视频| 日韩视频一区二区在线观看| 欧美国产欧美综合| 日本一不卡视频| 91老司机福利 在线| 久久久久久97三级| 日韩电影免费在线观看网站| jlzzjlzz欧美大全|