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 相关文章推荐
document.all还是document.getElementsByName?
Jul 21 Javascript
翻译整理的jQuery使用查询手册
Mar 07 Javascript
js 加载时自动调整图片大小
May 28 Javascript
html组件不可输入(只读)同时任何组件都有效
Apr 01 Javascript
浅析js封装和作用域
Jul 09 Javascript
js实现继承的5种方式
Dec 01 Javascript
AngularJS 与百度地图的结合实例
Oct 20 Javascript
jQuery用FormData实现文件上传的方法
Nov 21 Javascript
vue 请求后台数据的实例代码
Jun 22 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
浅谈JavaScript 声明提升
Sep 14 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
面包屑导航详解
2017/12/07 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
Python脚本实现格式化css文件
2015/04/08 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
python生成器与迭代器详解
2019/01/01 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
基于python实现雪花算法过程详解
2019/11/16 Python
解决Python二维数组赋值问题
2019/11/28 Python
Python谱减法语音降噪实例
2019/12/18 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
小学班级口号大全
2015/12/25 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
python入门之算法学习
2021/04/22 Python
介绍一下28个JS常用数组方法
2022/05/06 Javascript