最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

H5+WebSocket多文件同时上传

来源:动视网 责编:小采 时间:2020-11-27 15:06:05
文档

H5+WebSocket多文件同时上传

H5+WebSocket多文件同时上传:这次给大家带来H5+WebSocket多文件同时上传,H5+WebSocket多文件同时上传的注意事项有哪些,下面就是实战案例,一起来看一下。在传统的HTTP应用上传文件想要同时上传多个文件并查看上传进度是一件很麻烦的事情,当然现在也有一些基于SWF的文件上传组件提供
推荐度:
导读H5+WebSocket多文件同时上传:这次给大家带来H5+WebSocket多文件同时上传,H5+WebSocket多文件同时上传的注意事项有哪些,下面就是实战案例,一起来看一下。在传统的HTTP应用上传文件想要同时上传多个文件并查看上传进度是一件很麻烦的事情,当然现在也有一些基于SWF的文件上传组件提供
 这次给大家带来H5+WebSocket多文件同时上传,H5+WebSocket多文件同时上传的注意事项有哪些,下面就是实战案例,一起来看一下。

在传统的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.toBaseString = 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, BaseData: file.toBaseString()} }, 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方法,用于把文件块信息打包成base信息通过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 BaseData)
 {
 Console.WriteLine("FileID:{2},PageIndex:{0} Pages:{1} DataLength:{3}", PageIndex, Pages, FileID,BaseData.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来处理上传的信息,所以文件流要进行一个base的编码处理,由于websocket浏览提交的数据一般都有MASK处理再加上base那损耗相对来说比较重,实际上websocket有提供流的数据包格式(arraybuffer);当然这种处理在操作上就没有json来得方便简单.

下载代码:WebSocketUpload.rar

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

spring mvc+localResizeIMG实现H5端图片压缩上传

H5表单验证有哪些方法

H5实现旋转立体魔方

文档

H5+WebSocket多文件同时上传

H5+WebSocket多文件同时上传:这次给大家带来H5+WebSocket多文件同时上传,H5+WebSocket多文件同时上传的注意事项有哪些,下面就是实战案例,一起来看一下。在传统的HTTP应用上传文件想要同时上传多个文件并查看上传进度是一件很麻烦的事情,当然现在也有一些基于SWF的文件上传组件提供
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top