<!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. php项目命名规范

    命名规范 ThinkPHP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范: 目录和文件 目录使用小写+下划线: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并 ...

  2. 无序hashset与hashmap让其有序

    今天迭代hashmap时,hashmap并不能按照put的顺序,迭代输出值.用下述方法可以: HashMap<String,String> hashmap = new LinkedHash ...

  3. msgid 属性

    Android源码中的String.xml文件,msgid这个属性是干嘛的? 全局资源,方便引用.比如在布局的text和activity中用到.

  4. Tomcat在Window控制台下启动时乱码的两种解决办法

    在命令提示符中启动Tomcat时,日志窗口出现乱码: 乱码的原因肯定是日志解码错误引起的,因此就有一系列问题: 1.这个窗口的文本编码是什么? 窗口的文本编码查看:右击窗口>选项 可以看到窗口的 ...

  5. Java的实例化

    实例化是什么 1.在Java中,使用已经定义好的类,创建该类对象的过程称为"实例化". 2.实例化就是在堆中分配内存的过程,分配的内存即对象. 3.只有实例化后的对象,才能访问到类 ...

  6. 爬虫中xpath的特殊用法

    Xpath之starts-with(@属性名称,属性字符串相同部分) 以相同的字符开头的用法 在做爬虫时解析html的源码时候可能会遇见以下这种标签, <div id="test-1& ...

  7. 移动web开发中input等输入框问题

    移动端web开发时,input等输入框在安卓和iso中都有问题,分别有:1.iso不能点击其他区域使得输入框失去焦点2.iso输入框失去焦点后,键盘产生的空白部分不消失3.安卓端输入框得到焦点后,输入 ...

  8. C# 如何获取可执行文件路径的上上级目录

    1. DirectoryInfo di = new DirectoryInfo(string.Format(@"{0}..\..\", Application.StartupPat ...

  9. script 修改 plist遇到的问题

    一个sh脚本每次build的时候动态修改info.plist文件 达到动态更改版本号的目的 但是估计是因为缓存的缘故 每次只有clean之后再运行才会修改成功 看script执行的log 好像是先修改 ...

  10. 02-VC中的变量类型

    lp: long pointerb: BOOLsz: string zero(以0结尾的字符串) typedef const char* LPCSTRtypedef unsigned long DWO ...