亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

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

2024-09-05 07:21:53
字體:
來源:轉載
供稿:網友

在傳統的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  

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人免费视频| 欧美日韩亚洲天堂| 91精品久久久久久久久久久久久| 黄网站色欧美视频| 色老头一区二区三区| 91亚洲精品在线观看| 国产精品成人久久久久| 国产精品视频导航| 国产精品免费久久久久影院| 78m国产成人精品视频| 欧美高清在线视频观看不卡| 成人福利在线观看| 日韩免费在线免费观看| 中国日韩欧美久久久久久久久| 成人免费在线视频网址| 国产亚洲人成a一在线v站| 欧美剧在线观看| 91香蕉嫩草神马影院在线观看| 91爱爱小视频k| 久久久久久国产精品三级玉女聊斋| 久久精品精品电影网| 国产精品免费看久久久香蕉| 亚洲tv在线观看| 成人中文字幕+乱码+中文字幕| 福利二区91精品bt7086| 国产精品夜间视频香蕉| 国内免费精品永久在线视频| 精品视频偷偷看在线观看| 欧美午夜精品久久久久久人妖| 最近免费中文字幕视频2019| 亚洲精品一区二区网址| 亚洲欧美日韩第一区| 国产啪精品视频| 深夜福利一区二区| 日韩中文在线中文网在线观看| 日韩在线视频导航| 91精品国产一区| 国产精品久久久久久久久久99| 午夜精品三级视频福利| 美乳少妇欧美精品| 国产精品久久久亚洲| 亚洲综合成人婷婷小说| 亚洲人成绝费网站色www| 国产精品视频资源| 国产大片精品免费永久看nba| 456亚洲影院| 日韩成人久久久| 亚洲国产日韩欧美在线动漫| 欧美日韩成人黄色| 欧美精品video| 亚洲女人初尝黑人巨大| 久久久久日韩精品久久久男男| 欧美一级在线播放| 国产专区精品视频| 精品国产欧美一区二区三区成人| 一区二区三区美女xx视频| 亚洲福利在线看| 日韩精品中文字幕在线播放| 亚洲自拍欧美另类| 久久久精品在线| 国产精品福利在线| 亚洲国产精品va在线看黑人动漫| 7777kkkk成人观看| 亚洲精品久久久久| 欧美有码在线视频| 九九久久久久久久久激情| 国产精品九九久久久久久久| 国产欧美久久久久久| 91香蕉嫩草神马影院在线观看| 日韩欧美亚洲一二三区| 国产精品jizz在线观看麻豆| 日本国产高清不卡| 亚洲美女喷白浆| 成人黄色中文字幕| 91久久嫩草影院一区二区| 欧美性色视频在线| 538国产精品一区二区免费视频| 精品视频一区在线视频| 亚洲精品第一页| 福利微拍一区二区| 亚洲www在线观看| 欧美精品日韩www.p站| 国产日韩中文在线| 97在线视频国产| 久久精品国产96久久久香蕉| www日韩中文字幕在线看| 国产脚交av在线一区二区| 国产一区二区丝袜高跟鞋图片| 久久久久久久影视| 国产精品91在线| 人人做人人澡人人爽欧美| 欧美成人精品在线播放| 啊v视频在线一区二区三区| 日韩av免费在线播放| 国产69精品久久久| 国产精品精品一区二区三区午夜版| 91在线视频成人| 亚洲美女在线看| 亚洲人线精品午夜| 亚洲精品中文字| 国产日韩精品电影| 国产在线视频欧美| 亚洲自拍高清视频网站| 日韩美女在线观看一区| 亚洲自拍欧美另类| 亚洲欧美国产视频| 亚洲第一精品电影| 91av在线视频观看| 午夜精品一区二区三区在线| 美女国内精品自产拍在线播放| 国产精品专区h在线观看| 欧美日韩综合视频网址| 一本大道久久加勒比香蕉| 国产成人精彩在线视频九色| 国产一区香蕉久久| 精品久久久久久久大神国产| 亚洲精品久久久久国产| 欧美精品videos性欧美| 日本不卡高字幕在线2019| 国产精品国产三级国产aⅴ9色| 久久成人18免费网站| 日韩在线观看免费av| 亚洲精品成人免费| 亚洲欧美在线一区| 欧美成人三级视频网站| 国产一区二区香蕉| 国产日产亚洲精品| 欧美大片第1页| 久久电影一区二区| 亚洲欧美国产va在线影院| 欧美国产精品va在线观看| 亚洲亚裔videos黑人hd| 久久久久亚洲精品| 国产精品国产三级国产aⅴ9色| 成人中文字幕+乱码+中文字幕| 97在线视频精品| 国产精品女主播视频| 亚洲国产精久久久久久| 亚洲最新av网址| 亚洲黄色成人网| 中文字幕日韩欧美在线| 一本色道久久88综合日韩精品| 成人观看高清在线观看免费| 欧美专区国产专区| 日韩精品在线免费观看| 91av在线精品| 久久手机精品视频| 亚洲香蕉伊综合在人在线视看| 在线观看视频99| 精品人伦一区二区三区蜜桃网站| 欧美在线亚洲一区| 日韩一区二区在线视频| 亚洲2020天天堂在线观看| 91精品国产一区| 国产精品久久久久久一区二区| 精品中文字幕久久久久久| 久久久成人av| 亚洲国产成人在线播放| 国产精品大片wwwwww| 亚洲人成在线电影| 日韩免费在线看| 色综合男人天堂| 国产欧美精品日韩| 日本久久久久久久久|