plupload上传整个文件夹
大容量文件上传早已不是什么新鲜问题,在.net 2.0时代,HTML5也还没有问世,要实现这样的功能,要么是改web.config,要么是用flash,要么是用一些第三方控件,然而这些解决问题的方法要么很麻烦,比如改配置,要么不稳定,比如文件上G以后,上传要么死掉,要么卡住,通过设置web.config并不能很好的解决这些问题。
这是一个Html5统治浏览器的时代,在这个新的时代,这种问题已被简化并解决,我们可以利用Html5分片上传的技术,那么Plupload则是一个对此技术进行封装的前端脚本库,这个库的好处是可以自动检测浏览器是否支持html5技术,不支持再检测是否支持flash技术,甚至是sliverlight技术,如果支持,就使用检测到的技术。
那么这个库到哪里下载,怎么搭建呢,比较懒的童鞋还是用Install-Package 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);
});
/******************************************************Plupload***********************************************************/
后台 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;
}
}
}
效果展示:
详细配置信息可以参考这篇文章:
http://blog.ncmem.com/wordpress/2019/06/14/webuploader%e6%96%87%e4%bb%b6%e5%a4%b9%e4%b8%8a%e4%bc%a0/
plupload上传整个文件夹的更多相关文章
- Git上传空文件夹
git上传的文件夹为空的时候 1,先删除空的文件夹 参考:https://www.cnblogs.com/wang715100018066/p/9694532.html 2,这个只能说是技巧不能说是方 ...
- js上传整个文件夹
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- web上传整个文件夹
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- WEB上传一个文件夹
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- linux下怎么样上传下载文件夹
Linux下目录复制:本机->远程服务器 scp -r /home/shaoxiaohu/test1 zhidao@192.168.0.1:/home/test2 test1为源目录,test2 ...
- ASP.NET 使用 plupload 上传大文件时出现“blob”文件的Bug
最近在一个ASP.NET 项目中使用了plupload来上传文件,结果几天后客户发邮件说上传的文件不对,说是文件无法打开 在进入系统进行查看后发现上传的文件竟然没有后缀,经过一番测试发现如果文件上传的 ...
- java+上传一个文件夹
在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...
- plupload上传大文件
大容量文件上传早已不是什么新鲜问题,在.net 2.0时代,HTML5也还没有问世,要实现这样的功能,要么是改web.config,要么是用flash,要么是用一些第三方控件,然而这些解决问题的方法要 ...
- java+上传整个文件夹的所有文件
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
随机推荐
- 文件类型分类:头文件dirent.h中定义的文件类型与linux内文件符号对应关系
头文件 dirent.h 定义了文件类型: enum{ DT_UNKNOWN = 0, //未知类型 DT_FIFO = 1, //first in, ...
- skywalking 比较有意思的地方
获取agent jar包路径的方法: findPath(); private static File findPath() throws AgentPackageNotFoundException { ...
- GitHub的Fork是什么意思
GitHub的Fork 是什么意思[转] GitHub Help Simple guide to forks in GitHub and Git GitHub的Fork 是什么意思-N神3-博客园 G ...
- 【exgcd】卡片
卡片 题目描述 你有一叠标号为1到n的卡片.你有一种操作,可以重排列这些卡片,操作如下:1.将卡片分为前半部分和后半部分.2.依次从后半部分,前半部分中各取一张卡片,放到新的序列中.例如,对卡片序列( ...
- 题解-CTS2019氪金手游
Problem \(\mathtt {loj-3124}\) 题意概要:给定 \(n\) 个点,\(w_i\) 分别有 \(p_{i,1},p_{i,2},p_{i,3}\) 的概率取 \(1,2,3 ...
- NoSql 使用小结
NoSql 使用小结 足够的冗余 如果出现要拿某个 id 去查另外的 collection 的情况,说明应该往这个增加所要查询的字段 实在要做关联查询的话,是不是应该考虑关系型的数据库,关系和非关系混 ...
- html启动本地.exe文件
之前没有了解这个内容,还是一个小伙伴在面试中遇到的一个题目,感觉挺有意思就研究了一下这个东西到底是怎么用的.搜了一下解决方法,是添加注册表,自己运行了可以使用 第一步:首先打开注册表,方法是 win+ ...
- CocoaPods - 发布自己的模块(公有库、私有库)
CocoaPods发布框架到远程公有库 1.编写代码~上传远程仓库 git init git add . git commit -m '提交到本地分支' //关联远程仓库 git remote add ...
- iOS CGContextRef/UIBezierPath(绘图)
绘图的底层实现方法 注意:在drawRect方法中系统会默认创建一个上下文(C语言类型)在其他方法中不会有这样一个上下文(可以自己测试) @implementation DrawView //注意,在 ...
- jquery-weui滚动事件的注册与注销
注册infinite(50)是自定义的,详细暂时没去了解,可以不写即代表默认值. // body是整一块代码的标签,也就是滚动的部分. $('body').infinite().on("in ...