百度的WebUploader前端插件作为目前比较好用且免费的附件上传工具,利用了断点续传特点实现了大文件上传功能,其更好的兼容性与界面效果完全可以替换掉IE的activex 上传控件。许多人或许还不知道怎么使用,下面的详细介绍可帮助开发者快速使用。

webuploader 官方下载地址:https://fex.baidu.com/webuploader/download.html

用vs新建项目WebUploaderDemo

引入webuploader

编写一般处理程序代码

     /// <summary>
/// Upload 的摘要说明
/// </summary>
public class Upload : IHttpHandler
{
const string path = "/upfiles/";//上传目录
const string tempPath = "/upfiles/temp/";//上传临时目录 public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//如果进行了分片
if (context.Request.Form.AllKeys.Any(m => m == "chunk"))
{
//取得chunk和chunks
int chunk = Convert.ToInt32(context.Request.Form["chunk"]);//当前分片在上传分片中的顺序(从0开始)
int chunks = Convert.ToInt32(context.Request.Form["chunks"]);//总分片数 if (string.IsNullOrEmpty(context.Request["guid"]))
throw new Exception("[guid]不能为空"); //根据GUID创建用该GUID命名的临时文件夹
string folder = context.Server.MapPath(tempPath + context.Request["guid"] + "/");
string tempFile = folder + chunk; //建立临时传输文件夹
if (!Directory.Exists(Path.GetDirectoryName(folder)))
{
Directory.CreateDirectory(folder);
} FileStream addFile = new FileStream(tempFile, FileMode.Append, FileAccess.Write);
BinaryWriter AddWriter = new BinaryWriter(addFile);
//获得上传的分片数据流
HttpPostedFile file = context.Request.Files[];
Stream stream = file.InputStream; BinaryReader TempReader = new BinaryReader(stream);
//将上传的分片追加到临时文件末尾
AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
//关闭BinaryReader文件阅读器
TempReader.Close();
stream.Close();
AddWriter.Close();
addFile.Close(); TempReader.Dispose();
stream.Dispose();
AddWriter.Dispose();
addFile.Dispose();
string filePath = "";
if (chunk == chunks - )
{
filePath = path + DateTime.Now.ToString("yyyy/MM/") + Guid.NewGuid() + Path.GetExtension(file.FileName);//合并后的文件
ProcessRequest(folder, context.Server.MapPath(filePath));
}
context.Response.Write("{\"chunked\" : true, \"hasError\" : false, \"filePath\" : \"" + filePath + "\"}");
}
else//没有分片直接保存
{
string filePath = path + DateTime.Now.ToString("yyyy/MM/") + Guid.NewGuid() + Path.GetExtension(context.Request.Files[].FileName);//合并后的文件
context.Request.Files[].SaveAs(context.Server.MapPath(filePath));
context.Response.Write("{\"chunked\" : true, \"hasError\" : false, \"filePath\" : \"" + filePath + "\"}");
}
}
/// <summary>
/// 合并文件
/// </summary>
/// <param name="sourcePath">源数据文件夹</param>
/// <param name="filePath">合并后的文件</param>
private void ProcessRequest(string sourcePath, string filePath)
{
if (!Directory.Exists(Path.GetDirectoryName(filePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
}
DirectoryInfo dicInfo = new DirectoryInfo(sourcePath);
if (Directory.Exists(Path.GetDirectoryName(sourcePath)))
{
FileInfo[] files = dicInfo.GetFiles();
foreach (FileInfo file in files.OrderBy(f => int.Parse(f.Name)))
{
FileStream addFile = new FileStream(filePath, FileMode.Append, FileAccess.Write);
BinaryWriter AddWriter = new BinaryWriter(addFile); //获得上传的分片数据流
Stream stream = file.Open(FileMode.Open);
BinaryReader TempReader = new BinaryReader(stream);
//将上传的分片追加到临时文件末尾
AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
//关闭BinaryReader文件阅读器
TempReader.Close();
stream.Close();
AddWriter.Close();
addFile.Close(); TempReader.Dispose();
stream.Dispose();
AddWriter.Dispose();
addFile.Dispose();
}
Directory.Delete(sourcePath, true);
}
} /// <summary>
/// 删除文件夹
/// </summary>
/// <param name="strPath"></param>
private static void DeleteFolder(string strPath)
{
if (Directory.GetDirectories(strPath).Length > )
{
foreach (string fl in Directory.GetDirectories(strPath))
{
Directory.Delete(fl, true);
}
}
//删除这个目录下的所有文件
if (Directory.GetFiles(strPath).Length > )
{
foreach (string f in Directory.GetFiles(strPath))
{
System.IO.File.Delete(f);
}
}
}

编写前端代码

 <div id="uploadfile" class="updown">
<div class="title">
<label>上传</label>
</div>
<div id="uploader" class="wu-example">
<div class="btns">
<div id="pickerfile">选择文件</div>
<button id="ctlBtnUp" class="btn-default">开始上传</button>
</div> <!--用来存放文件信息-->
<div id="thelistupload" class="uploader-list"></div>
</div>
</div>
<script type="text/javascript">
var uploadindex = 0;
function UploadInit() {
uploadindex = 1;
var GUID = WebUploader.Base.guid(); //当前页面是生成的GUID作为标示
var $list = $("#thelistupload");
var uploader = WebUploader.create({ // swf文件路径
swf: '/plugins/webuploader-0.1.5/Uploader.swf', // 文件接收服务端。
server: "/ashx/Upload.ashx", // 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick: '#pickerfile',
formData: { guid: GUID },
// 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
resize: false,
//切片
chunked: true,
//每片的大小,C#接收文件也有默认大小,也可以自己在C#中修改
chunkSize: 2 * 1024 * 1024,
threads: 1,
accept: {
title: 'File',
extensions: '*',
mimeTypes: '*'
}
});
// 当有文件被添加进队列的时候
uploader.on('fileQueued', function (file) {
console.log(file);
$list.append('<div id="' + file.id + '" class="item">' +
'<h4 class="info">' + file.name + '(' + getfilesize(file.size) + ')</h4>' +
'<p class="state">等待上传...</p>' +
'</div>'); });
uploader.on('beforeFileQueued', function (file) {
$list.empty();
uploader.reset();
});
// 文件上传过程中创建进度条实时显示。
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id);
$li.find('p.state').text('上传中(' + (percentage * 100).toFixed(2) + '%)');
});
uploader.on('uploadSuccess', function (file) {
console.log("uploadSuccess:");
console.log(file);
$('#' + file.id).find('p.state').text('已上传');
}); uploader.on('uploadError', function (file, code) {
$('#' + file.id).find('p.state').text('上传出错');
}); uploader.on('uploadComplete', function (file) {
$('#' + file.id).find('.progress').fadeOut();
}); uploader.on('uploadAccept', function (file, response) {
console.log("uploadAccept:");
console.log(file);
console.log(response);
if (response['hasError'] != false) {
// 通过return false来告诉组件,此文件上传有错。 return false;
}
else {
return true;
}
});
$("#ctlBtnUp").on('click', function () {
uploader.upload();
});
} if (uploadindex === 0) {
UploadInit();
} // 计算文件大小函数(保留两位小数),Size为字节大小
// size:初始文件大小
function getfilesize(size) {
if (!size)
return ""; var num = 1024.00; //byte
if (size < num)
return size + "B";
if (size < Math.pow(num, 2))
return (size / num).toFixed(2) + "K"; //kb
if (size < Math.pow(num, 3))
return (size / Math.pow(num, 2)).toFixed(2) + "M"; //M
if (size < Math.pow(num, 4))
return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
} </script>

最终效果:

demo下载地址:

链接:https://pan.baidu.com/s/1bSMK7EZ6cdJMDeHMuFkYBA
提取码:i4cn

webuploader 快速应用(C#)的更多相关文章

  1. SpringMVC上传图片总结(2)--- 使用百度webuploader上传组件进行上传图片

    SpringMVC上传图片总结(2)--- 使用百度webuploader上传组件进行上传图片   在上一篇文章中,我们介绍了< SpringMVC上传图片的常规上传方法 >.本文接着第一 ...

  2. Webuploader 大文件分片上传

    百度Webuploader 大文件分片上传(.net接收)   前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片 ...

  3. Java快速开发平台——JEECG 3.7.8 版本发布!我们的目标是有鱼丸也有粗面

    JEECG 3.7.8 版本发布,多样化主题UI满足你不同的需求 导读                    ⊙平台性能优化,速度闪电般提升           ⊙提供5套新的主流UI代码生成器模板( ...

  4. 百度Webuploader 大文件分片上传(.net接收)

    前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片上传的帖子,参考之后,踏出了第一步.此文记录我这次实践的点滴,仅 ...

  5. php使用WebUploader做大文件的分块和断点续传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  6. webuploader+Java如何实现分片+断点续传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  7. 使用webuploader实现断点续传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  8. webuploader+上传文件夹

    在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...

  9. java 快速开发平台 有代码生成器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

随机推荐

  1. markdown语法(转)

    markdown语法 1.标题代码 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 2.引用代码 >你好 >> 您好 ...

  2. webpack中如何使用图标字体

    1.webpack安装相关依赖 $ npm install font-awesome-webpack less less-loader css-loader style-loader file-loa ...

  3. 小白 Python 爬虫部署 Linux

    前言 前面国庆节的时候写过一个简易的爬虫. <Python 简易爬虫实战> 还没看过的同学可以先看一下,这只爬虫主要用来爬取各个博客平台的阅读量等数据,一直以来都是每天晚上我自己手动在本地 ...

  4. 项目spring boot 写es hbase 运行内存溢出

    本地项目运行正常.服务器上运行内存溢出. 项目内部同时做插入oracle,es,hbase 经过测试发现 同时插入es,hbase是服务器上就会出现内存溢出 如果只插入oracle+es 或oracl ...

  5. Azure 上的物联网产品介绍

    微软云Azure上物联网产品提供了从设备接入到设备与云的双向通信,到数据在云中存储,到数据分析,最后到数据展示的完整解决方案,本文主要介绍一些基本的概念,后续的章节中,会详细介绍每款产品的使用方法及步 ...

  6. NOIP模拟 13

    我终于又厚颜无耻地赖着没走 ...... T1 矩阵游戏 用了30hmin找规律,然后发现貌似具有交换律,然后发现貌似有通项公式,然后发现貌似每次操作对通项的影响是相同的,然后发现貌似跟N没啥关系.. ...

  7. 【Java实践】Kettle从一次实验说起

    一,安装Kettle 1,关于简易安装Kettle 第一次接触kettle(以前只是听过罢了),摸索了几天,在mac源码安装失败,转而快速安装.在mac上安装最新版kettle并成功启动代码如下: ☁ ...

  8. python学习之【第十三篇】:Python中的生成器

    1.为什么要有生成器? 在Python中,通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅 ...

  9. 安全路径——最短路径树+dsu缩边

    题目描述 思路 首先想到$dijkstra$跑完之后$build$一棵最短路径树.要找到每个节点i到根的满足要求的最短路,考虑把一些非树边加进去. 对于非树边$(u,v)$,因为节点i上方的边被占领, ...

  10. canvas与工作流的不解之缘

    html的标签 <canvas>用于图形的绘制,通过脚本 (通常是JavaScript)来完成,canvas简而言之就是个画布.上一篇文章我们提到工作流的一个重要组成部分:流程建模,也就是 ...