BootStrap Progressbar 实现大文件上传的进度条的实例代码


Posted in Javascript onJune 27, 2016

1.首先实现大文件上传,如果是几兆或者几十兆的文件就用基本的上传方式就可以了,但是如果是大文件上传的话最好是用分片上传的方式。我这里主要是使用在客户端进行分片读取到服务器段,然后保存,到了服务器段读取完了之后将分片数据进行组合。

2.前端代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UploadTest2.aspx.cs" Inherits="Html5UploadTest.UploadTest2" %>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>HTML5大文件分片上传示例</title>
<script src="Scripts/jquery-1.8.2.js"></script>
<link href="bootstrap-progressbar/bootstrap-progressbar-3.3.4.css" rel="stylesheet" />
<script src="bootstrap-progressbar/bootstrap-progressbar.js"></script>
<%--<link href="JqueryUI/jquery-ui.css" rel="stylesheet" />
<script src="JqueryUI/jquery-ui.js"></script>--%>
<script>
function uploadFile() {
$("#upload").attr("disabled", "disabled");
var file = $("#file")[0].files[0], //文件对象
fileNum = $("#file")[0].files[0].length,
name = file.name, //文件名
size = file.size, //总大小
succeed = 0;
var shardSize = 2 * 1024 * 1024, //以2MB为一个分片
shardCount = Math.ceil(size / shardSize); //总片数
$('.progress .progress-bar').attr('data-transitiongoal', 0).progressbar({ display_text: 'fill' });
for (var i = 0; i < shardCount; ++i) {
//计算每一片的起始与结束位置
var start = i * shardSize,
end = Math.min(size, start + shardSize);
//构造一个表单,FormData是HTML5新增的
var form = new FormData();
form.append("data", file.slice(start, end)); //slice方法用于切出文件的一部分
form.append("name", name);
form.append("total", shardCount); //总片数
form.append("index", i + 1); //当前是第几片
//Ajax提交
$.ajax({
url: "Upload.ashx",
type: "POST",
data: form,
async: true, //异步
processData: false, //很重要,告诉jquery不要对form进行处理
contentType: false, //很重要,指定为false才能形成正确的Content-Type
success: function () {
++succeed;
$("#output").text(succeed + " / " + shardCount);
var percent = ((succeed / shardCount).toFixed(2)) * 100;
updateProgress(percent);
if (succeed == shardCount) {
$("#upload").removeAttr("disabled");
}
}
});
}
}
function progress(percent, $element) {
var progressBarWidth = percent * $element.width() / 100;
$element.find('div').animate({ width: progressBarWidth }, 500).html(percent + "% ");
}
//$(document).ready(function () {
// $('.progress .progress-bar').progressbar({ display_text: 'fill' });
//});
function updateProgress(percentage) {
$('.progress .progress-bar').attr('data-transitiongoal', percentage).progressbar({ display_text: 'fill' });
}
</script>
</head>
<body>
<input type="file" id="file" />
<button id="upload" onclick="uploadFile();">上传</button>
<span id="output" style="font-size: 12px">等待</span>
<div class="progress">
<div id="progressBar" class="progress-bar" role="progressbar" data-transitiongoal=""></div>
</div>
</body>
</html>

3. 后台一般处理程序如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
namespace Html5UploadTest
{
/// <summary>
/// Summary description for Upload
/// </summary>
public class Upload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
try
{
//从Request中取参数,注意上传的文件在Requst.Files中
string name = context.Request["name"];
int total = Convert.ToInt32(context.Request["total"]);
int index = Convert.ToInt32(context.Request["index"]);
var data = context.Request.Files["data"];
//保存一个分片到磁盘上
string dir = context.Request.MapPath("~/temp");
string file = Path.Combine(dir, name + "_" + index);
data.SaveAs(file);
//如果已经是最后一个分片,组合
//当然你也可以用其它方法比如接收每个分片时直接写到最终文件的相应位置上,但要控制好并发防止文件锁冲突
if (index == total)
{
file = Path.Combine(dir, name);
//byte[] bytes = null;
using (FileStream fs = new FileStream(file, FileMode.OpenOrCreate))
{
for (int i = 1; i <= total; ++i)
{
string part = Path.Combine(dir, name + "_" + i);
//bytes = System.IO.File.ReadAllBytes(part);
//fs.Write(bytes, 0, bytes.Length);
//bytes = null;
System.IO.File.Delete(part);
fs.Close();
}
}
}
}
catch (Exception)
{
throw;
}
//返回是否成功,此处做了简化处理
//return Json(new { Error = 0 });
}
public bool IsReusable
{
get
{
return false;
}
}
}
}

4.当然了后台还需要一些异常处理或者断电续传的工作要做,待续。。。

以上所述是小编给大家介绍的BootStrap Progressbar 实现大文件上传的进度条的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery加载图片时以淡入方式显示的方法
Jan 14 Javascript
jQuery实现菜单式图片滑动切换
Mar 14 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
Apr 06 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
Jan 28 Javascript
详解JavaScript对象类型
Jun 16 Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 Javascript
JS闭包与延迟求值用法示例
Dec 22 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 Javascript
jQuery:unbind方法的使用详解
Aug 14 jQuery
JS中Object对象的原型概念基础
Jan 29 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
JavaScript事件详细讲解
Jun 27 #Javascript
JS原型链怎么理解
Jun 27 #Javascript
js选择器全面解析
Jun 27 #Javascript
通过javascript进行UTF-8编码的实现方法
Jun 27 #Javascript
jQuery实现每隔几条元素增加1条线的方法
Jun 27 #Javascript
jQuery实现查找链接文字替换属性的方法
Jun 27 #Javascript
全面了解javascript三元运算符
Jun 27 #Javascript
You might like
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
使用Python开发windows GUI程序入门实例
2014/10/23 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
详解flask入门模板引擎
2018/07/18 Python
python解释器spython使用及原理解析
2019/08/24 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
环境科学专业大学生自荐信格式
2013/09/21 职场文书
区域销售经理岗位职责
2013/12/10 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
2014年学生会工作总结
2014/11/07 职场文书
旅游安全责任协议书
2016/03/22 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
深入详解JS函数的柯里化
2021/06/09 Javascript
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL