<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>文件上传</title>
    <link href="Css/bootstrap.css" rel="stylesheet" />
    <script src="Script/jquery-1.10.2.js"></script>
    <script src="Script/bootstrap.js"></script>
    <script>

function uploadFile() {
            //获取所有的文件控件
            var upfiles = $("input[type=file]");
            //所有文件的分页数
            var filesCountSum = 0;

//设置进度条初始值为0
            $('.progress .progress-bar')[0].style = "width:0%";
            $("#progressBar")[0].innerText = "0%";
            //移除提示框内容、清空文本
            $("#alertBox").removeClass();
            $("#alertBox").text("");
            //设置上传、重置按钮为禁用状态
            $("#upload").addClass("disabled");
            $("#reset").addClass("disabled");

//判断文件删除了几个
            if (upfiles[0].files[0] == undefined || upfiles[1].files[0] == undefined || upfiles[2].files[0] == undefined) {
                $("#alertBox").addClass("alert alert-danger");
                $("#alertBox").text("请上传3个文件");
                $("#upload").removeClass("disabled");
                $("#reset").removeClass("disabled");
            } else {
                //计算所有的文件分片总数
                upfiles.each(function () {
                    size = $(this)[0].files[0].size;

var shardSize = 2 * 1024 * 1024;   //以2MB为一个分片
                    filesCountSum += Math.ceil(size / shardSize);  //总片数

})

var succeed = 0;
                upfiles.each(function () {
                    var file = $(this)[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);  //总片数

//一个文件标签有多个文件的上传
                    //var ss = $(this)[0].files;
                    //for (var i = 0; i < ss.length; i++) {
                    //    console.log(ss[i])
                    //}

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: "/Handlers/UpLoad.ashx",
                            type: "POST",
                            data: form,
                            async: true,        //异步
                            processData: false,  //很重要,告诉jquery不要对form进行处理
                            contentType: false,  //很重要,指定为false才能形成正确的Content-Type
                            success: function () {
                                ++succeed;
                                //显示上传了多少片
                                $("#output").text(succeed + " / " + filesCountSum);
                                var percent = ((succeed / filesCountSum).toFixed(2)) * 100;
                                updateProgress(percent);
                                if (succeed == filesCountSum) {
                                    $("#upload").removeClass("disabled");
                                    $("#reset").removeClass("disabled");
                                    $("#alertBox").addClass("alert alert-success");
                                    $("#alertBox").text("上传成功");
                                }
                            },
                            error: function (req, status, msg) {
                                //如果失败则提示框显示
                                $("#alertBox").addClass("alert alert-danger");
                                $("#alertBox").text(msg);
                            }
                        });
                    }
                })
            }

}
        //用来延时显示更好的效果
        function progress(percent, $element) {
            var progressBarWidth = percent * $element.width() / 100;
            $element.find('div').animate({ width: progressBarWidth }, 500).html(percent + "% ");
        }

//修改精度条的长度显示当前删除到哪里
        function updateProgress(percentage) {
            $('.progress .progress-bar')[0].style = "width:" + percentage + "%";
            $("#progressBar")[0].innerText = percentage + "%";
        }

//重置
        function resetInpu() {
            $("input").each(function () {
                $("#output").text("")
                //标签清空进度条为0
                $(this).val("");
                $('.progress .progress-bar')[0].style = "width:0%";
                $("#progressBar")[0].innerText = "0%";
                //移除提示框内容、清空文本
                $("#alertBox").removeClass();
                $("#alertBox").text("");
            })
        }
    </script>

</head>
<body> 
    <div class="container head">
        <div class="row">
            <div class="panel panel-primary">
                <div class="panel-heading">上传文件</div>
                <div class="panel-body">
                    <!--提示框-->
                    <div class="" id="alertBox"></div>

<div class="input-group">
                        <span class="input-group-addon" id="basic-addon1">文件1</span>
                        <input type="file" id="file" class="form-control" placeholder="Username" aria-describedby="basic-addon1">
                    </div>
                    <br />

<div class="input-group">
                        <span class="input-group-addon" id="basic-addon1">文件2</span>
                        <input type="file" id="file2" class="form-control" placeholder="Username" aria-describedby="basic-addon1">
                    </div>
                    <br />

<div class="input-group">
                        <span class="input-group-addon" id="basic-addon1">文件3</span>
                        <input type="file" id="file3" class="form-control" placeholder="Username" aria-describedby="basic-addon1">
                    </div>
                    <br />

<!-- 进度条 -->
                    <div class="progress">
                        <div id="progressBar" class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuemax="100">
                            456456
                        </div>
                    </div>

<!-- 点击按钮 -->
                    <div class="col-md-12 text-center">
                        <button id="upload" onclick="uploadFile()" class="btn btn-primary">上传</button>

<span id="output" style="font-size: 12px">等待</span>

<button id="reset" onclick="resetInpu()" class="btn btn-primary">重置</button>

</div>

<form class="form-horizontal"></form>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

<后台>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.IO;

namespace BaWei.UpLoadFile.Web.Handlers
{
    /// <summary>
    /// 文件上传的一般处理程序
    /// </summary>
    public class UpLoad : IHttpHandler
    {

public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            try
            {
                //获取上传文件的名称
                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("/File");
                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 e)
            {
                context.Response.Write(e.Message.ToString());
            }
            //返回是否成功,此处做了简化处理
            //return Json(new { Error = 0 });
        }

public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

一般处理程序、Ajax多图片上传带进度条的更多相关文章

  1. MVC 图片上传 带进度条(转)

    MVC 图片上传小试笔记 form.js 这个插件已经是很有名的,结合MVC的html辅助方法异步上传就很简单了.jQuery Form Plugin :http://www.malsup.com/j ...

  2. bootstarp 多图片上传 带进度条

    前台代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...

  3. ajax实现图片上传与进度条

    这里使用的是bootstract的一个插件来实现 详情请查看文档中的进度条 https://v3.bootcss.com/components/ 引入必要的文件 <link href=" ...

  4. atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

    atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...

  5. atitit. 文件上传带进度条 atiUP 设计 java c# php

    atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.x ...

  6. HTML5多图片拖拽上传带进度条

    前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...

  7. HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条

    页面技术:HTML5 + AJAX ( jQuery) 后台技术:Servlet 3.0 服务器:Tomcat 7.0 jQuery版本:1.9.1 Servlet 3.0 代码 package or ...

  8. Struts2文件上传带进度条,虽然不是很完美

    好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...

  9. ajax异步文件上传和进度条

    一.ajax异步文件上传 之前有说过在form表单内的文件上传,但是会刷新页面,下面就来实现不刷新页面的异步文件上传 <div class="uploding_div"> ...

随机推荐

  1. 复旦高等代数II(18级)每周一题

    本学期将继续进行高等代数每周一题的活动.计划从第一教学周开始,到第十五教学周结束,每周的周末公布一道思考题(预计15道),供大家思考和解答.每周一题将通过“高等代数官方博客”(以博文的形式)和“高等代 ...

  2. Java程序设计第三次作业

    编写“学生”类及其测试类. 5.1 “学生”类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2:计算平均成绩 方法3:输出各个属性的值 ...

  3. The History of spring

    Spring的出现  Spring最早出现对早期J2EE规范复杂性的回应 .虽然有些人一直认为Java EE和Spring处于竞争中,但Spring实际上是对Java EE的补充.Spring编程模型 ...

  4. autoit脚本-从基本的函数用法开始

    适配浏览器:目前了解的有ie浏览器 MsgBox 显示可选提示超时的消息框 _ArrayDisplay _arraydisplay($aArray)  ;$aArra一般为数组,方法用于展示表格展示数 ...

  5. Python3 tkinter基础 Spinbox 可输入 能调整的 从指定范围内选择参数的控件

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. HTML与CSS的一些知识(一)

    一般写代码的时候,总会有些小错误.为了便于修改以及查找,所以代码格式要写规范,而且一定一定要写注释.因为有时候代码写得多了,真的连自己都找不到自己要找的东西在哪里.还有命名也要见名知意. 再说一些HT ...

  7. CSDN去广告插件

    因为避免不了与代码打交道,所以经常要上网搜代码,一般搜索到的资源都指向了CSDN,然而,好好的一篇博文,上面有很多广告,看着很不舒服,冲vip是不可能的,穷的的要死,怎么办呢?写个插件把! 去广告原理 ...

  8. Jquery中 .empty()和.append()

    jQuery empty() 方法:移除所选<div> 元素的内容: .empty()实例 jQuery append() 方法:在所选<> 元素结尾插入内容: .append ...

  9. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  10. 连接MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.

    MySQL time zone 时区错误 使用root用户登陆执行命令: ---> show variables like '%time_zone%'; 默认值system为美国时间:如下图: ...