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 相关文章推荐
Display SQL Server Version Information
Jun 21 Javascript
Javascript 陷阱 window全局对象
Nov 26 Javascript
Javascript 类与静态类的实现(续)
Apr 02 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 Javascript
windows下vue-cli导入bootstrap样式
Apr 25 Javascript
详解vue.js移动端导航navigationbar的封装
Jul 05 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
Apr 12 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
Jun 03 Javascript
详解React的回调渲染模式
Sep 10 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
ext jquery 简单比较
2010/04/07 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
用unescape反编码得出汉字示例
2014/04/24 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
详解Python进程间通信之命名管道
2017/08/28 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
什么是数据抽象
2016/11/26 面试题
英语文学专业学生的自我评价
2013/10/31 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
老乡聚会通知
2015/04/23 职场文书
中学推普周活动总结
2015/05/07 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android