百度的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. Mysql数据库(六)视图

    一.视图是由数据库中的一个表或多个表导出的虚拟表.其作用是方便用户对数据的操作. 1.视图的概念 2.视图的作用 二.创建视图 创建视图是指在已经存在的数据表上建立视图.视图可以建立在一张表中,也可以 ...

  2. C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?

    原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ...

  3. python基础-集合set及内置方法

    数据类型之集合-set 用途:多用于去重,关系运算 定义方式:通过大括号存储,集合中的每个元素通过逗号分隔.集合内存储的元素必须是不可变的,因此,列表-List 和字典dict 不能存储在集合中 注意 ...

  4. 学习笔记之javascript编写简单计算器

      感觉自己的的实力真的是有待提高,在编写计算器的过程中,出现了各种各样的问题,暴露了自己的基础不扎实,逻辑思维能力不够,学得知识不能运用到自己的demo中区.先介绍一些这个这个计算器的整体思路.大致 ...

  5. Apache Tomcat 远程代码执行漏洞(CVE-2019-0232)漏洞复现

    Apache Tomcat 远程代码执行漏洞(CVE-2019-0232)漏洞复现  一.     漏洞简介 漏洞编号和级别 CVE编号:CVE-2019-0232,危险级别:高危,CVSS分值:官方 ...

  6. 暑期集训20190725 加法(add)

    [题目描述] 数学课,黑板上写着n个数字,记为A1到An,fateice会重复以下操作若干次: 1. 选择两个奇偶性相同的整数Ai和Aj, 将他们擦去 2. 将Ai+Aj写在黑板上 问黑板上最终是否有 ...

  7. LVS DR模式实践

    client:192.168.4.10/24 proxy:192.168.4.5/24 VIP:   192.168.4.15/24 web1:192.168.4.100/24 VIP:192.168 ...

  8. CSPS模拟 100

    我又挂分了T_T 这么吉利的数字..本来想考的好一点的 T1 没加当前弧优化(其实也不会),若志了 各种低错连篇而且没想到点不联通..没有奇度点就直接从1开始搜了 于是喜提70(犯了这两个若志错误应该 ...

  9. Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示

    目录管理命令ls:列出指定目录下的内容格式: ls [OPTION]... [FILE]...   -a:显示所有文件包括隐藏文件   -A:显示除.和..之外的所有文件   -l,--long:显示 ...

  10. VNC的安装以及使用

    VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 UNIX 和  ...