使用jQuery Uploader显示文件上传进度

 更新时间:2011年12月22日 22:16:27   作者:  
在上传大文件的时候, 我们都希望可以向用户显示上传的进度, 那么这里介绍的就是使用 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">
上传:&nbsp;<asp:FileUpload ID="file" runat="server" />
</form>

也可以添加 type 属性为 file 的 input 元素:
复制代码 代码如下:

<form id="formFileUpload" runat="server" enctype="multipart/form-data">
上传:&nbsp;<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

相关文章

  • ASP.NET Core记录日志

    ASP.NET Core记录日志

    这篇文章介绍了ASP.NET Core记录日志的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#元组类型ValueTuple用法详解

    C#元组类型ValueTuple用法详解

    本文详细讲解了C#元组类型ValueTuple的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • asp.net微信开发(高级群发图文)

    asp.net微信开发(高级群发图文)

    这篇文章主要介绍了asp.net微信开发中有关高级群发图文的相关内容,需要的朋友可以参考下
    2015-11-11
  • ASP.NET图片处理三类经典问题

    ASP.NET图片处理三类经典问题

    这篇文章主要介绍了ASP.NET图片处理三类经典问题,验证码的实现、给图片加文字,最后一个就是生成缩略图,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • ADO.NET无连接模式的详细介绍

    ADO.NET无连接模式的详细介绍

    这篇文章详细介绍了ADO.NET无连接模式及操作实例,有需要的朋友可以参考一下
    2013-10-10
  • 提交页面的定位--scrollIntoView的用法

    提交页面的定位--scrollIntoView的用法

    提交页面的定位--scrollIntoView的用法...
    2007-03-03
  • 获取DataList控件的主键和索引实用图解

    获取DataList控件的主键和索引实用图解

    一是在DataList控件添加一个DataKeyField,以便获取到它的主键值,另外还添加了两个铵钮及一个Label标答,用来显示选择结果,真正将来你也许用不上标签,因为获取到结果之后,就可以进行你想的要事情了
    2013-01-01
  • .NET下文本相似度算法余弦定理和SimHash浅析及应用实例分析

    .NET下文本相似度算法余弦定理和SimHash浅析及应用实例分析

    这篇文章主要介绍了.NET下文本相似度算法余弦定理和SimHash浅析及应用,实例形式详细讲述了相似度算法余弦定理和SimHash的原理与用法,需要的朋友可以参考下
    2015-01-01
  • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)

    asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)

    在asp.net开发中,有很多可以上传的组件模块,利用HTML的File控件(uploadify)的上传也是一种办法,这里为大家介绍一下(uploadify)的一些使用方法
    2012-12-12
  • asp.net 预防SQL注入攻击之我见

    asp.net 预防SQL注入攻击之我见

    说起防止SQL注入攻击,感觉很郁闷,这么多年了大家一直在讨论,也一直在争论,可是到了现在似乎还是没有定论。当不知道注入原理的时候会觉得很神奇,怎么就被注入了呢?会觉得很难预防。但是当知道了注入原理之后预防不就是很简单的事情了吗?
    2009-11-11

最新评论