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

首頁 > 編程 > HTML > 正文

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

2024-08-26 00:19:19
字體:
來源:轉載
供稿:網友

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

實現功能

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

websocket上傳文件,websocket多上傳文件,html實現多文件上傳

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

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  

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


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品爽爽爽| 欧美精品一区二区三区国产精品| 欧美性视频在线| 中文精品99久久国产香蕉| 一夜七次郎国产精品亚洲| 欧美在线精品免播放器视频| 亚洲系列中文字幕| 亚洲free性xxxx护士hd| 国产精品爽爽ⅴa在线观看| 亚洲老司机av| 成人黄色免费在线观看| 日韩综合中文字幕| 91天堂在线视频| 久久久精品2019中文字幕神马| 日本精品免费观看| 大伊人狠狠躁夜夜躁av一区| 伊人成人开心激情综合网| 亚洲精品视频在线播放| 国产热re99久久6国产精品| 国模叶桐国产精品一区| 国产精品一区二区女厕厕| 亚洲欧美另类人妖| 国产精品扒开腿爽爽爽视频| 亚洲人成电影在线观看天堂色| 亚洲精品资源美女情侣酒店| 欧美日韩中文在线观看| 91香蕉嫩草影院入口| 在线观看国产成人av片| 欧美综合一区第一页| 欧美精品久久久久久久久久| 日韩亚洲综合在线| 成人免费午夜电影| 在线观看久久av| 国产精品美女久久久免费| 8090理伦午夜在线电影| 色小说视频一区| 亚洲美女www午夜| 国产精品免费视频久久久| 日韩影视在线观看| 国产精品video| 国产精品久在线观看| 成人激情在线观看| 狠狠做深爱婷婷久久综合一区| 亚洲精品视频网上网址在线观看| 中文字幕精品国产| 亚洲精品久久久久久下一站| 国产视频精品va久久久久久| 亚洲午夜精品视频| 大桥未久av一区二区三区| 久久在线精品视频| 亚洲无av在线中文字幕| 久久中国妇女中文字幕| 精品国产一区二区三区久久久| 全亚洲最色的网站在线观看| 日韩欧美aaa| 大伊人狠狠躁夜夜躁av一区| 精品日本美女福利在线观看| 日韩亚洲一区二区| 亚洲性生活视频在线观看| 日本一区二区在线免费播放| 日韩在线小视频| 国产午夜精品全部视频播放| 日韩精品在线影院| 久久精品国产亚洲| 亚洲激情电影中文字幕| 久久久爽爽爽美女图片| 亚洲天堂一区二区三区| 日韩中文字幕免费视频| 国产亚洲成精品久久| 国产精品久久久久77777| 性金发美女69hd大尺寸| 亚洲美女免费精品视频在线观看| 精品高清一区二区三区| 国产精品亚洲网站| 亚洲成人精品久久久| 国产脚交av在线一区二区| 欧美大片第1页| 中文字幕欧美专区| 国产精品成人av性教育| 97不卡在线视频| 国内精品中文字幕| 亚洲永久在线观看| 亚洲午夜未满十八勿入免费观看全集| 一区二区国产精品视频| 亚洲老头同性xxxxx| 亚洲va国产va天堂va久久| 欧美成人黄色小视频| 日韩av日韩在线观看| 成人a级免费视频| 国色天香2019中文字幕在线观看| 欧美大尺度在线观看| 日韩精品免费在线观看| 视频在线一区二区| 美女黄色丝袜一区| 深夜福利91大全| 精品久久中文字幕| 91精品久久久久久久久久| 亚洲成人在线视频播放| 国产最新精品视频| 亚洲福利视频免费观看| 色综合久久88| 91精品在线看| 亚洲国产欧美精品| 亚洲a在线观看| 日韩在线观看免费网站| 国产精品久久久久久久久久久久久久| 中文字幕亚洲一区二区三区五十路| 欧美激情亚洲另类| 91美女片黄在线观看游戏| 久久免费精品视频| 欧美成人精品激情在线观看| 亚洲肉体裸体xxxx137| 国产97在线视频| 国产欧美日韩亚洲精品| 国产欧美一区二区三区在线看| 亚洲人成77777在线观看网| 欧美激情xxxxx| 91精品久久久久久久久久| 热99精品只有里视频精品| 国产精品成人免费电影| 国产精品444| 成人黄色av网站| 精品国产乱码久久久久久天美| 亚洲精品suv精品一区二区| 亚洲欧美国产一本综合首页| 成人久久久久爱| 亚洲精品欧美日韩| 亚洲色图综合网| 亚洲成人国产精品| 日本一本a高清免费不卡| 欧美二区乱c黑人| 亚洲国模精品一区| 在线激情影院一区| 国产女精品视频网站免费| 亚洲欧洲中文天堂| 国产精品日日摸夜夜添夜夜av| 欧美天天综合色影久久精品| 欧美午夜女人视频在线| 欧美性猛交xxxx免费看漫画| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲高清福利视频| 亚洲精品久久7777777| 97视频国产在线| 88国产精品欧美一区二区三区| 日本高清不卡在线| 一区二区三区视频在线| 国产成人一区二| 久久手机免费视频| 色偷偷91综合久久噜噜| 亚洲jizzjizz日本少妇| 国产精品成人一区| 欧美激情亚洲另类| 一本大道久久加勒比香蕉| 亚洲欧美综合图区| 亚洲欧美中文日韩v在线观看| 亚洲成人激情在线观看| 亚洲欧美自拍一区| 欧美另类老女人| 懂色aⅴ精品一区二区三区蜜月| 亚洲最大在线视频| 国产欧美精品一区二区三区介绍| 久久精品免费播放| 亚洲国产精品专区久久| 日韩av影视综合网|