全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层

大容量文件上传早已不是什么新鲜问题,在.net 2.0时代,HTML5也还没有问世,要实现这样的功能,要么是改web.config,要么是用flash,要么是用一些第三方控件,然而这些解决问题的方法要么很麻烦,比如改配置,要么不稳定,比如文件上G以后,上传要么死掉,要么卡住,通过设置web.config并不能很好的解决这些问题。

这是一个Html5统治浏览器的时代,在这个新的时代,这种问题已被简化并解决,我们可以利用Html5分片上传的技术,那么Plupload则是一个对此技术进行封装的前端脚本库,这个库的好处是可以自动检测浏览器是否支持html5技术,不支持再检测是否支持flash技术,甚至是sliverlight技术,如果支持,就使用检测到的技术。

那么这个库到哪里下载,怎么搭建呢,比较懒的童鞋还是用Install-Package Plupload搞定吧,一个命令搞定所有事

下面给出一个例子,使用自已定义的控件来使用Plupload (Plupload也有自己的界面可以用),如下

Plupload支持的功能这里就不细说了,什么批量上传,这里我没有用到,主要是感觉它支持的事件非常丰富,文件选取后的事件,文件上传中的事件(可获得文件的上传进度),文件上传成功的事件,文件上传失败的事件,等等

我的例子主要是上传一个单个文件,并显示上传的进度条(使用jQuery的一个进度条插件)

下面的例子主要是为文件上传交给 UploadCoursePackage.ashx 来处理

      /******************************************************ProgressBar********************************************************/
      var progressBar = $("#loading").progressbar({ width: '500px', color: '#B3240E', border: '1px solid #000000' });
      /******************************************************Plupload***********************************************************/
      //实例化一个plupload上传对象
      var uploader = new plupload.Uploader({
        browse_button: 'browse', //触发文件选择对话框的按钮,为那个元素id
        runtimes: 'html5,flash,silverlight,html4',//兼容的上传方式
        url: "Handlers/UploadCoursePackage.ashx", //后端交互处理地址
        max_retries: 3,   //允许重试次数
        chunk_size: '10mb', //分块大小
        rename: true, //重命名
        dragdrop: false, //允许拖拽文件进行上传
        unique_names: true, //文件名称唯一性

        filters: { //过滤器
          max_file_size: '999999999mb', //文件最大尺寸
          mime_types: [ //允许上传的文件类型
            { title: "Zip", extensions: "zip" },
            { title: "PE", extensions: "pe" }
          ]
        },
        //自定义参数 (键值对形式) 此处可以定义参数
        multipart_params: {
          type: "misoft"
        },
        // FLASH的配置
        flash_swf_url: "../Scripts/plupload/Moxie.swf",

        // Silverligh的配置
        silverlight_xap_url: "../Scripts/plupload/Moxie.xap",

        multi_selection: false //true:ctrl多文件上传, false 单文件上传 
      });

      //在实例对象上调用init()方法进行初始化
      uploader.init();

      uploader.bind('FilesAdded', function (uploader, files) {
        $("#<%=fileSource.ClientID %>").val(files[0].name);
        $.ajax(
        {
          type: 'post',
          url: 'HardDiskSpace.aspx/GetHardDiskFreeSpace',
          data: {},
          dataType: 'json',
          contentType: 'application/json;charset=utf-8',
          success: function (result) {
            //选择文件以后检测服务器剩余磁盘空间是否够用
            if (files.length > 0) {
              if (parseInt(files[0].size) > parseInt(result.d)) {
                $('#error-msg').text("文件容量大于剩余磁盘空间,请联系管理员!");
              } else {
                $('#error-msg').text("");
              }
            }
          },
          error: function(xhr, err, obj) {
            $('#error-msg').text("检测服务器剩余磁盘空间失败");
          }
        });
      });

      uploader.bind('UploadProgress', function (uploader, file) {
        var percent = file.percent;
        progressBar.progress(percent);
      });

      uploader.bind('FileUploaded', function (up, file, callBack) {
        var data = $.parseJSON(callBack.response);
        if (data.statusCode === "1") {
          $("#<%=hfPackagePath.ClientID %>").val(data.filePath);
          var id = $("#<%=hfCourseID.ClientID %>").val();
          __doPostBack("save", id);
        } else {
          hideLoading();
          $('#error-msg').text(data.message);
        }
      });

      uploader.bind('Error', function (up, err) {
        alert("文件上传失败,错误信息: " + err.message);
      });

后台 UploadCoursePackage.ashx 的代码也重要,主要是文件分片跟不分片的处理方式不一样

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

namespace WebUI.Handlers
{
  /// <summary>
  /// UploadCoursePackage 的摘要说明
  /// </summary>
  public class UploadCoursePackage : IHttpHandler
  {

    public void ProcessRequest(HttpContext context)
    {
      context.Response.ContentType = "text/plain";

      int statuscode = 1;
      string message = string.Empty;
      string filepath = string.Empty;

      if (context.Request.Files.Count > 0)
      {
        try
        {
          string resourceDirectoryName = System.Configuration.ConfigurationManager.AppSettings["resourceDirectory"];
          string path = context.Server.MapPath("~/" + resourceDirectoryName);
          if (!Directory.Exists(path))
            Directory.CreateDirectory(path);

          int chunk = context.Request.Params["chunk"] != null ? int.Parse(context.Request.Params["chunk"]) : 0; //获取当前的块ID,如果不是分块上传的。chunk则为0
          string fileName = context.Request.Params["name"]; //这里写的比较潦草。判断文件名是否为空。
          string type = context.Request.Params["type"]; //在前面JS中不是定义了自定义参数multipart_params的值么。其中有个值是type:"misoft",此处就可以获取到这个值了。获取到的type="misoft";

          string ext = Path.GetExtension(fileName);
          //fileName = string.Format("{0}{1}", Guid.NewGuid().ToString(), ext);
          filepath = resourceDirectoryName + "/" + fileName;
          fileName = Path.Combine(path, fileName);

          //对文件流进行存储 需要注意的是 files目录必须存在(此处可以做个判断) 根据上面的chunk来判断是块上传还是普通上传 上传方式不一样 ,导致的保存方式也会不一样
          FileStream fs = new FileStream(fileName, chunk == 0 ? FileMode.OpenOrCreate : FileMode.Append);
          //write our input stream to a buffer
          Byte[] buffer = null;
          if (context.Request.ContentType == "application/octet-stream" && context.Request.ContentLength > 0)
          {
            buffer = new Byte[context.Request.InputStream.Length];
            context.Request.InputStream.Read(buffer, 0, buffer.Length);
          }
          else if (context.Request.ContentType.Contains("multipart/form-data") && context.Request.Files.Count > 0 && context.Request.Files[0].ContentLength > 0)
          {
            buffer = new Byte[context.Request.Files[0].InputStream.Length];
            context.Request.Files[0].InputStream.Read(buffer, 0, buffer.Length);
          }

          //write the buffer to a file.
          if (buffer != null)
            fs.Write(buffer, 0, buffer.Length);
          fs.Close();

          statuscode = 1;
          message = "上传成功";

        }
        catch (Exception ex)
        {
          statuscode = -1001;
          message = "保存时发生错误,请确保文件有效且格式正确";

          Util.LogHelper logger = new Util.LogHelper();
          string path = context.Server.MapPath("~/Logs");
          logger.WriteLog(ex.Message, path);
        }
      }
      else
      {
        statuscode = -404;
        message = "上传失败,未接收到资源文件";
      }

      string msg = "{\"statusCode\":\"" + statuscode + "\",\"message\":\"" + message + "\",\"filePath\":\"" + filepath + "\"}";
      context.Response.Write(msg);
    }

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

再附送一个检测服务器端硬盘剩余空间的功能吧

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebUI
{
  public partial class CheckHardDiskFreeSpace : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    /// <summary>
    /// 获取磁盘剩余容量
    /// </summary>
    /// <returns></returns>
    [WebMethod]
    public static string GetHardDiskFreeSpace()
    {
      const string strHardDiskName = @"F:\";

      var freeSpace = string.Empty;
      var drives = DriveInfo.GetDrives();
      var myDrive = (from drive in drives
        where drive.Name == strHardDiskName
        select drive).FirstOrDefault();
      if (myDrive != null)
      {
        freeSpace = myDrive.TotalFreeSpace+""; 
      }
      return freeSpace;
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# plupload  # 进度条  # 加进度条  # 上传进度条  # 基于JS实现视频上传显示进度条  # JS+html5实现异步上传图片显示上传文件进度条功能示例  # 原生JS上传大文件显示进度条 php上传文件代码  # js实现带进度条提示的多视频上传功能  # 原生javascript上传图片带进度条【实例分享】  # PHP + plupload.js实现多图上传并显示进度条加删除实例代码  # JS插件plupload.js实现多图上传并显示进度条  # js HTML5 Ajax实现文件上传进度条功能  # PHP中使用Session配合Javascript实现文件上传进度条功能  # JS实现上传文件显示进度条  # 上传  # 文件上传  # 主要是  # 磁盘空间  # 分片  # 自定义  # 流进  # 自己的  # 的是  # 也有  # 很好  # 也会  # 有个  # 在这个  # 就不  # 则是  # 可以用  # 已被  # 这是一个 


相关文章: 如何通过虚拟主机快速完成网站搭建?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何配置支付宝与微信支付功能?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  如何将凡科建站内容保存为本地文件?  如何实现建站之星域名转发设置?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  如何确认建站备案号应放置的具体位置?  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何通过二级域名建站提升品牌影响力?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  建站之星多图banner生成与模板自定义指南  常州自助建站工具推荐:低成本搭建与模板选择技巧  TestNG的testng.xml配置文件怎么写  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  用v-html解决Vue.js渲染中html标签不被解析的问题  定制建站是什么?如何实现个性化需求?  建站之星北京办公室:智能建站系统与小程序生成方案解析  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  简单实现Android验证码  如何通过虚拟主机空间快速建站?  如何用腾讯建站主机快速创建免费网站?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  如何在云主机上快速搭建网站?  网站制作新手教程,新手建设一个网站需要注意些什么?  建站主机类型有哪些?如何正确选型  如何获取开源自助建站系统免费下载链接?  青岛网站建设如何选择本地服务器?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  制作网站的公司有哪些,做一个公司网站要多少钱?  如何在云服务器上快速搭建个人网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站之星如何修改网站生成路径?  如何在VPS电脑上快速搭建网站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  ,有什么在线背英语单词效率比较高的网站?  如何设计高效校园网站?  建站之星如何保障用户数据免受黑客入侵?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  模具网站制作流程,如何找模具客户?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  建站主机选哪种环境更利于SEO优化?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何选择服务器才能高效搭建专属网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。