使用jQuery Uploader顯示文件上傳進(jìn)度
本文將說(shuō)明 Uploader 控件的功能以及使用過(guò)程中的注意事項(xiàng)和技巧, 目錄如下:
* 準(zhǔn)備
* 創(chuàng)建保存頁(yè)面
* 添加 FileUpload 控件
* 設(shè)置 EnableSessionState
* 調(diào)用 Uploader 的 Save 方法
* 創(chuàng)建獲取進(jìn)度的頁(yè)面
* 創(chuàng)建上傳頁(yè)面
* 設(shè)置保存頁(yè)面
* 設(shè)置獲取進(jìn)度的頁(yè)面
* 上傳
* 隱藏保存頁(yè)面



準(zhǔn)備
請(qǐng)確保已經(jīng)在 Download 下載資源 中的 JQueryElement.dll 下載一節(jié)下載 JQueryElement 最新的版本.
請(qǐng)使用指令引用如下的命名空間:
<%@ 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 下載一節(jié)下載的壓縮包中包含了一個(gè)自定義樣式的 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>
創(chuàng)建保存頁(yè)面
保存頁(yè)面是一個(gè)簡(jiǎn)單的頁(yè)面, 主要完成文件的保存工作, 保存頁(yè)面不會(huì)自己提交, 而是由上傳頁(yè)面提交.
添加 FileUpload 控件
首先, 為保存頁(yè)面添加 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 元素, 則可能需要設(shè)置 form 的 enctype 屬性為 multipart/form-data.
設(shè)置 EnableSessionState
需要設(shè)置保存頁(yè)面的 EnableSessionState 為 ReadOnly, 這樣可以在保存頁(yè)面保存文件時(shí), 請(qǐng)求獲取進(jìn)度的頁(yè)面. 這主要是由于, ASP.NET 順序執(zhí)行可以讀寫(xiě) Session 的頁(yè)面:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="FileUpload.aspx.cs" Inherits="uploader_FileUpload"
EnableSessionState="ReadOnly" %>
調(diào)用 Uploader 的 Save 方法
在保存頁(yè)面的 Page_Load 方法中, 調(diào)用 Uploader 控件的 Save靜態(tài)方法來(lái)保存文件:
protected void Page_Load ( object sender, EventArgs e )
{
if ( this.IsPostBack && this.file.HasFile )
// TODO: 這里設(shè)置 waitSecond 參數(shù)是為了在測(cè)試時(shí)顯示上傳的進(jìn)度,
// 在實(shí)際的使用中請(qǐng)不要設(shè)置 waitSecond, 并調(diào)整 bufferSize 為一個(gè)合理的值.
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 );
}
代碼中, 通過(guò) IsPostBack 和 HasFile 屬性判斷在用戶提交了文件后, 才進(jìn)行保存.
Save 方法的格式為 Save ( string filePath, HttpPostedFile postedFile, Uploader.UploadInfo uploadInfo, int bufferSize, int waitSecond ), filePath 參數(shù)是文件保存的完整路徑, postedFile 參數(shù)是提供文件控制的 HttpPostedFile 對(duì)象, 可以從 FileUpload 控件獲取, uploadInfo 參數(shù)是保存上傳進(jìn)度信息的對(duì)象, bufferSize 參數(shù)是保存文件時(shí)的緩存大小, 默認(rèn) 128kb 保存一次, 最后一個(gè)參數(shù) waitSecond 只在測(cè)試時(shí)使用, 表示緩存被保存后的等待時(shí)間, 這樣可以確??吹竭M(jìn)度.
上傳大于 4mb 的文件, 請(qǐng)修改 web.config 的 maxRequestLength, 可以參考 http://msdn.microsoft.com/zh-cn/library/e1f13641(v=vs.71).aspx.
創(chuàng)建獲取進(jìn)度的頁(yè)面
包含進(jìn)度信息的對(duì)象 Uploader.UploadInfo 被保存在 Session 中, 因此可以隨時(shí)從 Session中獲取進(jìn)度信息:
<%@ 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 實(shí)現(xiàn)了接口 IReadOnlySessionState, 而不是 IRequiresSessionState. 原因也是和設(shè)置 EnableSessionState 為 ReadOnly 類似的. 至于如何返回 JSON 數(shù)據(jù), 請(qǐng)參考 在不同的 .NET 版本中返回 JSON.
創(chuàng)建上傳頁(yè)面
最后一步就是創(chuàng)建一個(gè)上傳頁(yè)面, 在頁(yè)面中添加 Uploader控件:
<je:Uploader ID="uploader" runat="server" IsVariable="true"
UploadUrl="FileUpload.aspx"
ProgressUrl="getprec.ashx" ProgressChanged="
function(data){
if(-:data.prec == '-')
$('#prec').text('沒(méi)有進(jìn)度!');
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="開(kāi)始" Click="
function(){
cmdUpload.hide();
uploader.__uploader('hide').__uploader('upload');
pb.show();
}">
</je:Button>
設(shè)置保存頁(yè)面
通過(guò) Uploader 的 UploadUrl 屬性, 可以選擇保存頁(yè)面, 示例中, 選擇了頁(yè)面 FileUpload.aspx, 這將自動(dòng)生成一個(gè) iframe 元素, iframe 的 src 屬性指向 FileUpload.aspx 頁(yè)面.
也可以自定義一個(gè) iframe, 然后通過(guò) Upload屬性選擇此 iframe:
<iframe id="myIFrame" src="FileUpload.aspx"></iframe>
<je:Uploader ID="uploader" runat="server" IsVariable="true"
Upload="#myIFrame"
... >
</je:Uploader>
設(shè)置獲取進(jìn)度的頁(yè)面
通過(guò)屬性 ProgressUrl 和 ProgressChanged 可以獲取并顯示上傳進(jìn)度, ProgressUrl 表示返回進(jìn)度信息的頁(yè)面地址, ProgressChanged 則用于處理返回的進(jìn)度等信息.
此外 ProgressInterval 屬性表示查詢進(jìn)度的時(shí)間間隔, 默認(rèn)為 1000 毫秒.
上傳
調(diào)用 uploader 的 upload方法, 即可觸發(fā)上傳操作:
<je:Button ID="cmdUpload" runat="server" IsVariable="true"
Label="開(kāi)始" Click="
function(){
uploader.__uploader('upload');
}">
</je:Button>
默認(rèn)情況下將對(duì)保存頁(yè)面的第一個(gè)表單執(zhí)行 submit 操作, 可以通過(guò) UploadForm 屬性來(lái)調(diào)整需要提交的表單的索引.
隱藏保存頁(yè)面
調(diào)用 uploader 的 hide方法, 即可隱藏保存頁(yè)面:
uploader.__uploader('upload');
JQueryElement 是開(kāi)源共享的代碼, 可以在 http://code.google.com/p/zsharedcode/wiki/Download 頁(yè)面下載 dll 或者是源代碼.
實(shí)際過(guò)程演示: http://www.tudou.com/programs/view/-Zvwz5xsih8/, 建議全屏觀看.
- 分享20多個(gè)很棒的jQuery 文件上傳插件或教程
- jQuery Ajax文件上傳(php)
- php+jQuery.uploadify實(shí)現(xiàn)文件上傳教程
- Jquery Uploadify多文件上傳帶進(jìn)度條且傳遞自己的參數(shù)
- Jquery結(jié)合HTML5實(shí)現(xiàn)文件上傳
- jQuery文件上傳插件Uploadify使用指南
- jQuery實(shí)現(xiàn)文件上傳進(jìn)度條特效
- jquery插件ajaxupload實(shí)現(xiàn)文件上傳操作
- js jquery分別實(shí)現(xiàn)動(dòng)態(tài)的文件上傳操作按鈕的添加和刪除
- jQuery頁(yè)面彈出框?qū)崿F(xiàn)文件上傳
相關(guān)文章
遞歸輸出ASP.NET頁(yè)面所有控件的類型和ID的代碼
遞歸輸出ASP.NET頁(yè)面所有控件的類型和ID的代碼,需要的朋友可以參考下。2012-01-01
asp.net 獲取目錄下的文件數(shù)和文件夾數(shù)
遍歷一個(gè)文件夾中的文件,需要用到DirectoryInfo類中的一個(gè)重要的方法GetFileSystemInfos(),此方法返回指定的是與搜索條件相匹配的文件和子目錄的強(qiáng)類型 FileSystemInfo對(duì)象的數(shù)組。2010-07-07
在asp.net中使用加密數(shù)據(jù)庫(kù)聯(lián)接字符串保證數(shù)據(jù)安全
加密web.config可以有效保證數(shù)據(jù)庫(kù)用戶和密碼安全,下面是示例代碼,大家可以看看2014-09-09
干貨來(lái)襲! C# 7.0 新特性(VS2017可用)
干貨來(lái)襲! 為大家分享了C# 7.0 新特性,VS2017可用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Visual Studio 2017新版發(fā)布 更強(qiáng)大!
Visual Studio 2017新版發(fā)布 更強(qiáng)大!對(duì)Visual Studio 2017感興趣的小伙伴們可以參考一下2017-05-05
大型門(mén)戶網(wǎng)站實(shí)現(xiàn)的十四大技術(shù)小結(jié)
參考下大型門(mén)戶網(wǎng)站的技術(shù),大家可以盡量的備份好服務(wù)器。2010-10-10

