博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5 WebSocket实例(三)-文件上传处理
阅读量:4288 次
发布时间:2019-05-27

本文共 6091 字,大约阅读时间需要 20 分钟。

一、后台处理:

public void ProcessRequest(HttpContext context)        {            //处理WebSocket 请求            context.AcceptWebSocketRequest(DoWork);        }        ///         /// 委托处理函数定义        ///         /// 当前WebSocket上下文        /// 
public async Task DoWork(AspNetWebSocketContext context) { //1.获取当前WebSocket 对象 WebSocket socket = context.WebSocket; string filename = ""; //2.监视相应 while (true) { /* * 此处缓存数组指定读取客户端数据的长度 * 如果客户端发送数据超过当前缓存区,则会读取多次 */ ArraySegment
buffer = new ArraySegment
(new byte[1024 * 256]); //接收客户端信息 CancellationToken token; WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, token); if (socket.State == WebSocketState.Open) { //判断是否已经到了最后 int curLength = Math.Min(buffer.Array.Length, result.Count); //判断用户传入的类型进行处理 if (result.MessageType == WebSocketMessageType.Text) { string msg = Encoding.UTF8.GetString(buffer.Array, 0, curLength); filename = msg; buffer = new ArraySegment
(Encoding.UTF8.GetBytes("接收文件名成功:" + filename)); await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } else if (result.MessageType == WebSocketMessageType.Binary) { //创建并保存文件,如果上传成功,返回当前接收到的文件大小 string msg = SaveFile(filename, buffer, curLength); buffer = new ArraySegment
(Encoding.UTF8.GetBytes(curLength.ToString())); await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } } else { break; } } } ///
/// 追加二进制数据到文件 /// public string SaveFile(string file, ArraySegment
buffer, int Length) { //去除文件名中的前后空格 file = file.Trim(); string fullname = @"F:\JavaScript_Solution\H5Solition\UploadWebForm\content\" + file; try { FileStream fs = new FileStream(fullname, FileMode.Append, FileAccess.Write); try { byte[] result = buffer.ToArray(); fs.Write(result, 0, Length); } finally { fs.Close(); } return "保存文件成功"; } catch (Exception ex) { return ex.Message; } }
二,前台处理

HTML:

分段读取文件:
JS:

/*    * 测试WebSocket上传    * 本地浏览器上传速度测试单个文件,上传速度IE>FF>Google(Google浏览器慢相当多,原因:点击查看)    */var fileBox = document.getElementById('file');var reader = null;  //读取操作对象var step = 1024 * 256;  //每次读取文件大小 ,字节数var cuLoaded = 0; //当前已经读取总数var file = null; //当前读取的文件对象var enableRead = true;//标识是否可以读取文件var total = 0;        //记录当前文件总字节数var startTime = null; //标识开始上传时间fileBox.onchange = function () {    //获取文件对象    file = this.files[0];    total = file.size;    console.info("文件大小:" + file.size);    if (ws == null) {        if (window.confirm('建立与服务器链接失败,确定重试链接吗')) {            createSocket(function () {                bindReader();            });        }        return;    }    bindReader();}//绑定readerfunction bindReader() {    cuLoaded = 0;    startTime = new Date();    enableRead = true;    reader = new FileReader();    //读取一段成功    reader.onload = function (e) {        console.info('读取总数:' + e.loaded);        if (enableRead == false)            return false;        //根据当前缓冲区来控制客户端读取速度        if (ws.bufferedAmount > step * 10) {            setTimeout(function () {                //继续读取                console.log('--------------》进入等待');                loadSuccess(e.loaded);            }, 3);        } else {            //继续读取            loadSuccess(e.loaded);        }    }    //开始读取    readBlob();}//读取文件成功处理function loadSuccess(loaded) {    //将分段数据上传到服务器    var blob = reader.result;    //使用WebSocket 服务器发送数据    if (cuLoaded == 0) //发送文件名        ws.send(file.name);    ws.send(blob);    //如果没有读完,继续    cuLoaded += loaded;    if (cuLoaded < total) {        readBlob();    } else {        console.log('总共上传:' + cuLoaded + ',总共用时:' + (new Date().getTime() - startTime.getTime()) / 1000);    }    //显示结果进度    var percent = (cuLoaded / total) * 100;    document.getElementById('Status').innerText = percent;    document.getElementById('progressOne').value = percent;}//指定开始位置,分块读取文件function readBlob() {    //指定开始位置和结束位置读取文件    var blob = file.slice(cuLoaded, cuLoaded + step);    reader.readAsArrayBuffer(blob);}//中止function stop() {    //中止读取操作    console.info('中止,cuLoaded:' + cuLoaded);    enableRead = false;    reader.abort();}//继续function containue() {    console.info('继续,cuLoaded:' + cuLoaded);    enableRead = true;    readBlob();}var ws = null;//创建和服务器的WebSocket 链接function createSocket(onSuccess) {    var url = 'ws://localhost:55373/ashx/upload3.ashx';    ws = new WebSocket(url);    ws.onopen = function () {        console.log('connected成功');        if (onSuccess)            onSuccess();    }    ws.onmessage = function (e) {        var data = e.data;        if (isNaN(data) == false) {            //console.log('当前上传成功:' + data);        } else {            console.info(data);        }    }    ws.onclose = function (e) {        //中止客户端读取        stop();        console.log('链接断开');    }    ws.onerror = function (e) {        //中止客户端读取        stop();        console.info(e);        console.log('传输中发生异常');    }}//页面加载完建立链接createSocket();

更多实例:

分段上传七:

分段上传八:

更多Demo源代码:

你可能感兴趣的文章
Fiddler抓包8-打断点(bpu)
查看>>
Python安装和安装selenium
查看>>
python接口自动化1-发送get请求 request
查看>>
No module named 'email.mime'; 'email' is not a package
查看>>
编写第一个自动化脚本
查看>>
2017.05.06 记雏鹰博客系统开工第4天。
查看>>
雏鹰开发附件2– Mybatis相关xml配置
查看>>
SpringBoot 入门:环境搭建与HelloWorld~
查看>>
SpringBoot 入门:整合MongoDB,做简单查找功能
查看>>
自学大话设计模式——简单工厂模式与策略模式
查看>>
读Java核心技术36讲有感——谈谈对Java的理解,谈谈Exception和Error
查看>>
foobar2000中文版官方下载【多功能的音频播放器】
查看>>
【分析微软为何延迟发布Win8.1】
查看>>
【德国磁盘清理●V4.1.0 中文版】磁盘碎片整理工具
查看>>
【详细解析Windows7系统防火墙设置】
查看>>
【教你完美解决Windows7系统乱码问题】
查看>>
金馆长qq表情包●绿色版【金馆长表情252个】
查看>>
卡巴斯基安全部队2013中文免费版【可免费使用一个月】
查看>>
【Win8网络被攻击教你手动绑定ARP技巧】
查看>>
【让U盘的使用记录在注册表中消失的方法】
查看>>