使用jQuery Uploader显示文件上传进度_实用技巧

请到 Download 下载资源 的 JQueryElement 示例下载一节下载示例代码 (下载)
本文将说明 Uploader 控件的功能以及使用过程中的注意事项和技巧, 目录如下:
* 准备
* 创建保存页面
* 添加 FileUpload 控件
* 设置 EnableSessionState
* 调用 Uploader 的 Save 方法
* 创建获取进度的页面
* 创建上传页面
* 设置保存页面
* 设置获取进度的页面
* 上传
* 隐藏保存页面


准备
请确保已经在 Download 下载资源 中的 JQueryElement.dll 下载一节下载 JQueryElement 最新的版本.
请使用指令引用如下的命名空间:

复制代码 代码如下:

<%@ Register Assembly="zoyobar.shared.panzer.JQueryElement"
Namespace="zoyobar.shared.panzer.ui.jqueryui.plusin"
TagPrefix="je" %>
<%@ Register Assembly="zoyobar.shared.panzer.JQueryElement"
Namespace="zoyobar.shared.panzer.web.jqueryui"
TagPrefix="je" %>

除了命名空间, 还需要引用 jQueryUI 的脚本和样式, 在 Download 下载资源 的 JQueryElement.dll 下载一节下载的压缩包中包含了一个自定义样式的 jQueryUI, 如果需要更多样式, 可以在 http://jqueryui.com/download 下载:除了命名空间, 还需要引用 jQueryUI 的脚本:

复制代码 代码如下:

<link type="text/css" rel="stylesheet" href="[样式路径]/jquery-ui-<version>.custom.css" />
<script type="text/javascript" src="[脚本路径]/jquery-<version>.min.js"></script>
<script type="text/javascript" src="[脚本路径]/jquery-ui-<version>.custom.min.js"></script>

创建保存页面
保存页面是一个简单的页面, 主要完成文件的保存工作, 保存页面不会自己提交, 而是由上传页面提交.
添加 FileUpload 控件
首先, 为保存页面添加 FileUpload 控件:

复制代码 代码如下:

<form id="formFileUpload" runat="server">
上传: <asp:FileUpload ID="file" runat="server" />
</form>

也可以添加 type 属性为 file 的 input 元素:

复制代码 代码如下:

<form id="formFileUpload" runat="server" enctype="multipart/form-data">
上传: <input type="file" id="file" runat="server" />
</form>

如果使用 input 元素, 则可能需要设置 form 的 enctype 属性为 multipart/form-data.
设置 EnableSessionState
需要设置保存页面的 EnableSessionState 为 ReadOnly, 这样可以在保存页面保存文件时, 请求获取进度的页面. 这主要是由于, ASP.NET 顺序执行可以读写 Session 的页面:

复制代码 代码如下:

<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="FileUpload.aspx.cs" Inherits="uploader_FileUpload"
EnableSessionState="ReadOnly" %>

调用 Uploader 的 Save 方法
在保存页面的 Page_Load 方法中, 调用 Uploader 控件的 Save静态方法来保存文件:

复制代码 代码如下:

protected void Page_Load ( object sender, EventArgs e )
{
if ( this.IsPostBack && this.file.HasFile )
// TODO: 这里设置 waitSecond 参数是为了在测试时显示上传的进度,
// 在实际的使用中请不要设置 waitSecond, 并调整 bufferSize 为一个合理的值.
Uploader.Save (
this.Server.MapPath ( @"~/uploader/photo.jpg" ),
this.file.PostedFile,
this.Session["myphotouploadinfo"] as Uploader.UploadInfo,
1,
1 );
// Uploader.Save (
// this.Server.MapPath ( @"~/uploader/photo.jpg" ),
// this.file.PostedFile,
// this.Session["myphotouploadinfo"] as Uploader.UploadInfo );
}

代码中, 通过 IsPostBack 和 HasFile 属性判断在用户提交了文件后, 才进行保存.
Save 方法的格式为 Save ( string filePath, HttpPostedFile postedFile, Uploader.UploadInfo uploadInfo, int bufferSize, int waitSecond ), filePath 参数是文件保存的完整路径, postedFile 参数是提供文件控制的 HttpPostedFile 对象, 可以从 FileUpload 控件获取, uploadInfo 参数是保存上传进度信息的对象, bufferSize 参数是保存文件时的缓存大小, 默认 128kb 保存一次, 最后一个参数 waitSecond 只在测试时使用, 表示缓存被保存后的等待时间, 这样可以确保看到进度.
上传大于 4mb 的文件, 请修改 web.config 的 maxRequestLength, 可以参考 http://msdn.microsoft.com/zh-cn/library/e1f13641(v=vs.71).aspx.
创建获取进度的页面
包含进度信息的对象 Uploader.UploadInfo 被保存在 Session 中, 因此可以随时从 Session中获取进度信息:

复制代码 代码如下:

<%@ WebHandler Language="C#" Class="uploader_getprec" %>
using System.Collections.Generic;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.SessionState;
using zoyobar.shared.panzer.ui.jqueryui.plusin;
public class uploader_getprec : IHttpHandler,
IReadOnlySessionState
{
public void ProcessRequest ( HttpContext context )
{
context.Response.ContentType = "text/javascript";
context.Response.Cache.SetNoStore ( );
Uploader.UploadInfo info =
context.Session["myphotouploadinfo"] as Uploader.UploadInfo;
SortedDictionary<string, object> json =
new SortedDictionary<string, object> ( );
if ( null == info )
json.Add ( "prec", "-" );
else
{
json.Add ( "prec", info.Percent );
json.Add ( "total", info.ContentLength );
json.Add ( "posted", info.PostedLength );
if ( info.Percent == 100 )
json.Add ( "url", "photo.jpg" );
/*
* {
* "prec": 20.23
* "total": 2000,
* "posted": 2
* }
* */
}
context.Response.Write (
new JavaScriptSerializer ( ).Serialize ( json )
);
}

需要注意的是, uploader_getprec 实现了接口 IReadOnlySessionState, 而不是 IRequiresSessionState. 原因也是和设置 EnableSessionState 为 ReadOnly 类似的. 至于如何返回 JSON 数据, 请参考 在不同的 .NET 版本中返回 JSON.
创建上传页面
最后一步就是创建一个上传页面, 在页面中添加 Uploader控件:

复制代码 代码如下:

<je:Uploader ID="uploader" runat="server" IsVariable="true"
UploadUrl="FileUpload.aspx"
ProgressUrl="getprec.ashx" ProgressChanged="
function(data){
if(-:data.prec == '-')
$('#prec').text('没有进度!');
else
if(-:data.prec == 100){
$('#prec').text('完成, 图片路径为: ' + -:data.url);
pb.hide();
$('#photo').show().attr('src', -:data.url);
}
else{
$('#prec').text(-:data.posted +
' bytes/' + -:data.total + ' bytes, ' +
-:data.prec + '%');
pb.progressbar('option', 'value', -:data.prec);
}
}
">
</je:Uploader>
<je:Button ID="cmdUpload" runat="server" IsVariable="true"
Label="开始" Click="
function(){
cmdUpload.hide();
uploader.__uploader('hide').__uploader('upload');
pb.show();
}">
</je:Button>

设置保存页面
通过 Uploader 的 UploadUrl 属性, 可以选择保存页面, 示例中, 选择了页面 FileUpload.aspx, 这将自动生成一个 iframe 元素, iframe 的 src 属性指向 FileUpload.aspx 页面.
也可以自定义一个 iframe, 然后通过 Upload属性选择此 iframe:

复制代码 代码如下:

<iframe id="myIFrame" src="FileUpload.aspx"></iframe>
<je:Uploader ID="uploader" runat="server" IsVariable="true"
Upload="#myIFrame"
... >
</je:Uploader>

设置获取进度的页面
通过属性 ProgressUrl 和 ProgressChanged 可以获取并显示上传进度, ProgressUrl 表示返回进度信息的页面地址, ProgressChanged 则用于处理返回的进度等信息.
此外 ProgressInterval 属性表示查询进度的时间间隔, 默认为 1000 毫秒.
上传
调用 uploader 的 upload方法, 即可触发上传操作:

复制代码 代码如下:

<je:Button ID="cmdUpload" runat="server" IsVariable="true"
Label="开始" Click="
function(){
uploader.__uploader('upload');
}">
</je:Button>

默认情况下将对保存页面的第一个表单执行 submit 操作, 可以通过 UploadForm 属性来调整需要提交的表单的索引.
隐藏保存页面
调用 uploader 的 hide方法, 即可隐藏保存页面:

复制代码 代码如下:

uploader.__uploader('upload');

JQueryElement 是开源共享的代码, 可以在 http://code.google.com/p/zsharedcode/wiki/Download 页面下载 dll 或者是源代码.

实际过程演示: http://www.tudou.com/programs/view/-Zvwz5xsih8/, 建议全屏观看.

欢迎访问 panzer 开源项目, http://zsharedcode.googlecode.com/ , 其中包含了 IEBrowser 控制 WebBrowser 执行各种 js 和 jQuery 脚本以及录制功能 和 jQueryUI 的 Asp.net 控件 JQueryElement, 微博: http://t.qq.com/zoyobar

时间: 2024-11-05 16:35:34

使用jQuery Uploader显示文件上传进度_实用技巧的相关文章

Asp.net MVC中使用JQuery插件ajaxFileUpload上传文件_实用技巧

0 ajaxFileUpload简介  ajaxFileUpload插件是一个非常简单的基于Jquery的异步上传文件的插件,使用过程中发现很多与这个同名的,基于原始版本基础之上修改过的插件,文件版本比较多,我把我自己使用的ajaxFileUpload文件上传到博客园上了,想要使用的朋友可以下载:http://xiazai.jb51.net/201611/yuanma/ajaxfileupload(jb51.net).rar.  整个插件源码不到200行,实现非常简单,大致原理就是通过js动态创

asp.net批量多选文件上传解决方案_实用技巧

多选文件上传,已经非常多了,选择性多了可能有时候要比较下哪个更合适,结合到项目中使用更方便才是最重要的.很多的多选上传基本上都是调用的swf文件,确实用flash 或flex开发一个多选上传的功能很方便,比如flex里内置的FileReferenceList对象本身就支持文件的多选,有这个的话就方便多了,下面要说的主要也是基于flex开发的一个多选上传功能.主要实现的功能如下: 一.选择多个文件上传并显示单个文件的上传进度 二.显示所有文件总的上传进度 三.显示所有上传文件的总大小 四.上传前可

asp.net neatUpload 支持大文件上传组件_实用技巧

1.在工具箱中添加Brettle.Web.NeatUpload.dll,可以看到工具箱中出现InputFile等控件. 2.复制文件夹NeatUpload到根目录. 3.拖放使用上传控件InputFile和进度条ProgressBar,添加上传文件的按钮.aspx页面代码如下: 复制代码 代码如下: <body> <form id="form1" runat="server"> <div> <upload:InputFile

asp.net图片上传实例_实用技巧

第一.图片上传,代码如下:xxx.aspx 复制代码 代码如下:  <td class="style1">                 <asp:FileUpload ID="FileUpload1" runat="server"  />                <asp:Button ID="Button1" runat="server" Text="上传

Asp.Net超大文件上传问题解决_实用技巧

  最近涉及到用asp.net做上传功能的一个问题,因为asp.net有fileupload的上传控件,但是这个控件上传的文件大小有限,所以根本满足不了需求百度了下,很多人遇到asp.net上传超大文件的困惑,偶尔搜索发现csdn有个哥们提到这个超大文件如何实现,RadUpload.Net2.dll并且提供了这个动态库进行处理超大文件的上传处理过程.于是就下载下来看了看,果然效果不错,不但支持吵过700M的文件上传快速,更重要的是支持多线程的上传文件.查看源代码发现利用的控件也是fileuplo

asp.net 简便无刷新文件上传系统_实用技巧

ps:flash实现的效果是好得多,但这不是我研究的范围,也没什么可比性. 兼容:ie6/7/8, firefox 3.5.5, opera 10.01, safari 4.0.3, chrome 3.0 效果预览 文件上传 选择文件 重命名 操作 状态 重置 选择文件 重置 选择文件 重置 选择文件 ps:由于需要后台,要测试系统请下载实例测试. ps2:在完整实例文件中,还有一个文件属性查看实例. 程序说明 [upload] 程序中最重要的方法就是upload了,调用它就可以进行无刷新上传.

asp.net 模拟提交有文件上传的表单(通过http模拟上传文件)_实用技巧

我们暂且不说如何去模拟数据,通过一个简单的form看看当请求发生时,客户端提交了什么样的数据给服务端. 下面是一个简单的html form,两个文本输入框,一个文件上传(这里我选择一张图片),注意有文件上传的form的enctype属性. 复制代码 代码如下: <form action="sql.aspx" method="post" enctype="multipart/form-data"> <input id="

C# 通用文件上传类_实用技巧

1.Upfile.aspx: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Upfile.aspx.cs" Inherits="Inc_Upfile" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http

使用HttpWebRequest向网站模拟上传数据_实用技巧

最近有个朋友离开IT行业二年的朋友说要实现用程序向某个网站的页面上传数据,他是意思是每天有几十条数据要在网站页面上填写,很烦,最好用程序来写.网站页面是用POST传递的,同时没有验证码之类的东东,只有一点限制就是5分种内不能填写二次记录.这一切都好办. using System.Web;using System.Net;using System.Text;using System.IO; //创建对某个网站页面的请求 HttpWebRequest  myRequest = (HttpWebReq