上传大容量文件不再是一个新问题。在。net 2.0时代,HTML5还没出来。为了实现这个功能,我们应该或者更改web.config,或者使用flash,或者使用一些第三方控件。但是,这些解决问题的方法要么麻烦,比如改变配置,要么不稳定。比如文件上G之后,上传不是死就是卡。设置web.config不能很好地解决这些问题。
这是一个Html5主导浏览器的时代。在这个新时代,这个问题得到了简化和解决。我们可以使用Html5片段上传技术,而Plupload就是封装这种技术的前端脚本库。这个库的优点是可以自动检测浏览器是否支持html5技术,但不支持重新检测是否支持flash技术甚至sliverlight技术。如果有,它将使用检测到的技术。
那么这个库在哪里下载,怎么建,懒人童鞋还是用Install-Package Plupload完成,一切都用一个命令完成
下面举一个例子,使用自定义控件来使用plopoload(plopoload也有自己的接口),如下
Plupload支持的功能这里就不细说了。我这里不用,主要是觉得它支持很多事件,比如文件选择后的事件、文件上传期间的事件(可以得到文件上传进度)、文件上传成功的事件、文件上传失败的事件等等
我的例子主要是上传单个文件并显示上传的进度条(使用jQuery的进度条插件)
以下示例主要用于将文件上传到UploadCoursePackage.ashx进行处理
/* * * * * * * * * * * * * * * * * * * * *进度条* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * var进度条=$(' # loading ').progressbar({ width: '500px ',color: '#B3240E ',边框: ' 1px实线# 000000 ' });/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Plupload * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//实例化一个plupload上传对象var uploader=new plupload .上传程序({ browse_button: 'browse ',//触发文件选择对话框的按钮,为那个元素id runtimes: ' html5,flash,silverlight,html4 ',//兼容的上传方式网址: '处理程序/上传课程包。 ashx ',//后端交互处理地址max_retries: 3,//允许重试次数chunk_size: '10mb ',//分块大小rename: true,//重命名dragdrop: false,//允许拖拽文件进行上传unique _ names: true,//文件名称唯一性filters: { //过滤器max_file_size: '999999999mb ',//文件最大尺寸mime _ type :[//允许上传的文件类型{ title: 'Zip ',extensions: 'zip' },{ title: 'PE ',extensions: 'pe' } ] },//自定义参数(键值对形式)此处可以定义参数multipart _ params 3360 { type : ' misoft ' },//FLASH的配置' flash_swf_url: './Scripts/plupload/Moxie.swf ',//Silverligh的配置silverlight_xap_url: './Scripts/plupload/Moxie.xap ',multi _ selection : false//true : ctrl多文件上传,假的单文件上传});//在实例对象上调用init()方法进行初始化上传者。init();上传者。绑定('文件标记',函数(上传程序,文件){ $(' # %=文件传输).客户端id“% 1”).val(文件[0]。姓名);$.ajax({ type: 'post ',URL : ' hardiskspace。aspx/gethardiskfreespace ',data: {},dataType: 'json ',内容类型: ' application/JSON;charset=utf-8 ',成功:函数(结果){ //选择文件以后检测服务器剩余磁盘空间是否够用if(文件。长度0){ if(ParSeint)(文件[0]).大小)ParSeint(结果。d)){ $(' # error-msg ').文本('文件容量大于剩余磁盘空间,请联系管理员!');} else { $('#error-msg ').文本("");} } },错误:函数(xhr,err,obj) { $('#error-msg ').文本('检测服务器剩余磁盘空间失败');} });});uploader.bind('UploadProgress ',函数(上传者,文件){ var percent=file。百分比;progressBar.progress(百分比);});uploader.bind('FileUploaded ',函数(向上,文件,回调){ var data=$ .parseJSON(回调。回应);if(数据。status code===' 1 '){ $(' # %=hfPackagePath).客户端id“% 1”).val(数据。文件路径);var id=$('#%=hfCourseID .客户端id“% 1”).val();__doPostBack('save ',id);} else { HideLoadIng();$(“# error-msg”).文本(数据。消息);} });上传程序.绑定('错误',函数(up,err) { alert('文件上传失败,错误信息: '错误。消息);});后台UploadCoursePackage.ashx的代码也重要,主要是文件分片跟不分片的处理方式不一样
使用系统;使用系统。集合。通用;使用系统Linq .使用系统网络.使用系统IO;命名空间WebUI .处理程序{///summary///UploadCoursePackage的摘要说明////摘要公共类uploadcoursePackage : IHttpHandler { public void process request(HttpContext context){ context } .响应。内容类型='文本/纯文本;int状态代码=1;字符串消息=字符串。空的;字符串文件路径=字符串。空的;如果(上下文请求。文件。计数0){尝试{ string resourcedordername=System .配置。配置管理器。appsettings['资源目录'];字符串路径=上下文服务器。MapPath(' ~/' resource dordername ');if(!目录。存在(路径))目录创建目录(路径);int组块=上下文。请求。参数['区块']!=null?里面的解析(上下文。请求参数['区块']): 0;//获取当前的块身份证,如果不是分块上传的大块。则为0字符串文件名=上下文。请求参数['名称'];//这里写的比较潦草。判断文件名是否为空字符串类型=上下文。请求参数['类型'];//在前面射流研究…中不是定义了自定义参数多部分参数的值么。其中有个值是类型类型type: ' misoft ',此处就可以获取到这个值了。获取到的type=' misoft字符串扩展名=路径. GetExtension(FIlename);//fileName=字符串。格式(“{0}{1}”,Guid .NewGuid().ToString(),ext);文件路径=resourcedordname/' FIlename;文件名=路径。组合(路径,文件名);//对文件流进行存储需要注意的是文件目录必须存在(此处可以做个判断)根据上面的矮胖的人或物来判断是块上传还是普通上传上传方式不一样,导致的保存方式也会不一样FileStream fs=新的FileStream(fileName,chunk==0?文件模式OpenOrCreate :文件模式。追加);//将我们的输入流写入缓冲区byte[]缓冲区=null如果(上下文。请求。内容类型=="应用程序/八位字节流"上下文。请求。内容长度0) {缓冲区=新字节[上下文请求。inputstream。长度];语境。请求。输入流。读取(缓冲区,0,缓冲区。长度);} else if(上下文。包含(多部分/表单数据)上下文。请求。文件。计数0上下文。请求文件[0]。内容长度0){缓冲区=新字节[上下文。请求文件[0]。语境。请求。文件[0]。输入流。读取(缓冲区,0,缓冲区。长度);}//将缓冲区写入文件如果(缓冲!=null) fs .写(缓冲区,0,缓冲区。长度);fs .close();状态代码=1;消息='上传成功;} catch(Exception ex){ statuscode=-1001;消息='保存时发生错误,请确保文件有效且格式正确;乌提尔LogHelper logger=new Util .LogHelper();字符串路径=上下文服务器。映射路径(' ~/Logs ');伐木工写日志(例如。消息,路径);} } else {状态代码=-404;消息='上传失败,未接收到资源文件;}字符串msg=' { '状态代码' : ' '状态代码' ', '消息' : ' '消息' ', '文件路径' : ' '文件路径' ' } ';语境。回应。写(味精);} public bool IsReuse { get { return false;} } }}再附送一个检测服务器端硬盘剩余空间的功能吧
使用系统;使用系统。集合。通用;使用系统IO;使用系统Linq .使用系统网络.使用系统。网页。脚本。服务;使用系统。网络服务;使用系统网络。用户界面使用系统。网络控件;命名空间WebUI{公共分部类checkhardskfreespace :系统.网络。ui。页面{受保护的无效页面_加载(对象发送方,EventArgs e) { } ///summary //获取磁盘剩余容量////summary///returns/returns[WebMethod]公共静态字符串gethardskfreespace(){ const string strhardskname=@ ' f : ';var freeSpace=string .空的;var drives=DriveInfo .getdrivers();var myDrive=(从驱动器中的驱动器开始,其中驱动器名称==strHardDiskName(选择驱动器)。first ordefault();if (myDrive!=null) { freeSpace=myDrive .TotalFreeSpace}返回freeSpace} }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。