您的位置:首页 > 编程语言 > ASP

Asp.net使用Plupload上传组件详解

2017-05-12 17:29 956 查看
  每天上班在地铁上都有看今日头条的习惯,偶然的一次机会看到了关于Plupload的一篇文章,今日头条真是包罗万象啊。

  首先来了解一下Plupload的功能和特点:

拥有多种呈现方式,如HTML5、Silverlight、Flash以及普通的<input type=”file”/>,Plupload会根据当前的浏览器选择合适的呈现方式;

支持以拖拽的方式选择文件;

支持前端压缩照片,即文件上传前就对图片进行压缩

支持分片上传,可以将一个大文件分割成多部分上传

  接下来我们看如何使用

  前端代码:  

<div id="filelist">Your browser doesn't have Flash, Silverlight or HTML5 support.</div>
<div id="upload_p">
<button id="browse">选择文件</button>
<button id="start_upload">开始上传</button>
</div>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/plupload/plupload.full.min.js"></script>
<script>
  //文件类型过滤器
plupload.addFileFilter('file_types', function (fileTypes, file, cb) {
  var undef;
  // 验证文件类型
if (file.name !== undef) {
  var nameArray = file.name.split(".");
  var fileExt = ".";
if (nameArray.length > 1) {
  fileExt += nameArray[1].toLowerCase();
}
if (fileTypes.indexOf(fileExt) === -1) {
  this.trigger('Error', {
  code: plupload.FILE_EXTENSION_ERROR,
  message: plupload.translate('File extension error.'),
  file: file
        });
cb(false);
} else {
cb(true);
}
} else {
  cb(true);
}
  });
//实例化一个plupload上传对象
var uploader = new plupload.Uploader({
    browse_button: 'browse', //触发文件选择对话框的按钮,为那个元素id
    url: 'upload.ashx', //服务器端的上传页面地址
    flash_swf_url: 'Script/plupload/Moxie.swf', //swf文件,当需要使用swf方式进行上传时需要配置该参数
    silverlight_xap_url: 'Script/plupload/Moxie.xap', //silverlight文件,当需要使用silverlight方式进行上传时需要配置该参数
    chunk_size: "2mb",  //分片大小,0为不分片
    unique_names: true, //是否生成唯一文件名
    multi_selection: true,//是否多选
    file_data_name: "file", //上传文件域的名称
    filters: {
      //文件限制
//mime_types: [ //只允许上传图片和zip文件
//   { title: "Image files", extensions: "jpg,gif,png" },
//   { title: "Zip files", extensions: "zip" },
//   { title: "Excel files", extensions: "xlsx,xls" }
//],
  max_file_size: '400kb', //最大只能上传400kb的文件
file_types: ['.jpg', '.chm'],//自定义的文件类型设置
prevent_duplicates: true //不允许选取重复文件
},
init: {
  PostInit: function () {
        //组件初始化完成
    document.getElementById('filelist').innerHTML = '';
    $("#start_upload").click(function () {
      uploader.start();
      return false;
    })
  },
FilesAdded: function (up, files) {
  plupload.each(files, function (file) {
  document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>';
  });
},
BeforeUpload: function (up, file) {
  uploader.setOption("multipart_params", { username: $("#username").val() })
},
UploadProgress: function (up, file) {
  document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
},
FileUploaded: function (up, file, responseObject) {
  //某个文件上传完成时触发,可以在此处处理相关逻辑
console.log("文件上传成功,服务器返回:");
console.log(responseObject.response);
},
ChunkUploaded: function (up, file, responseObject) {
  //使用分片时某个片上传完成时触发
console.info(responseObject);
},
UploadComplete: function (up, files) {
  //文件全部上传完成时
plupload.each(files, function (file) {
  console.info(file.id);
});
},
Error: function (up, error) {
  if (error.code === plupload.FILE_SIZE_ERROR) {
  alert("超过文件大小");
}
else if (error.code === plupload.FILE_EXTENSION_ERROR) {
  alert("格式不允许");
}
}
     }
  });
//初始化上传组件
uploader.init();
</script>


  后台代码upload.ashx如下:

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
HttpPostedFile file = context.Request.Files["file"];
string name = context.Request.Form["name"]; //文件名一定从Request.Form["name"]中获取,因为在分片的时候file.FileName的值是不正确的
int chunk = Convert.ToInt32(context.Request.Form["chunk"]); //当前分片
int chunks = Convert.ToInt32(context.Request.Form["chunks"]);//分片数
string uploadPath = context.Server.MapPath("~/upload");
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
string filePath = Path.Combine(uploadPath, name);  
FileStream fs = new FileStream(filePath, chunk == 0 ? FileMode.OpenOrCreate : FileMode.Append);
Stream inputStream = file.InputStream;
byte[] buffer = new byte[inputStream.Length];
inputStream.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, buffer.Length);
fs.Close();
context.Response.Write("{\"success\":true}");
}


在前端页面的代码中,我自定义了一个file_types的文件类型的过滤属性,在Plupload的官方文档中已经有定义了关于文件类型的filters.mime_types属性,但是用组件中本身提供的过滤属性,在选择文件的时候,文件对话框会打开很慢。更多使用方法,请到官网http://www.plupload.com/中查看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: