使用jQuery Uploader顯示文件上傳進度
本文將說明 Uploader 控件的功能以及使用過程中的注意事項和技巧, 目錄如下:
* 準備
* 創(chuàng)建保存頁面
* 添加 FileUpload 控件
* 設(shè)置 EnableSessionState
* 調(diào)用 Uploader 的 Save 方法
* 創(chuàng)建獲取進度的頁面
* 創(chuàng)建上傳頁面
* 設(shè)置保存頁面
* 設(shè)置獲取進度的頁面
* 上傳
* 隱藏保存頁面
準備
請確保已經(jīng)在 Download 下載資源 中的 JQueryElement.dll 下載一節(jié)下載 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 下載一節(jié)下載的壓縮包中包含了一個自定義樣式的 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)建保存頁面
保存頁面是一個簡單的頁面, 主要完成文件的保存工作, 保存頁面不會自己提交, 而是由上傳頁面提交.
添加 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 元素, 則可能需要設(shè)置 form 的 enctype 屬性為 multipart/form-data.
設(shè)置 EnableSessionState
需要設(shè)置保存頁面的 EnableSessionState 為 ReadOnly, 這樣可以在保存頁面保存文件時, 請求獲取進度的頁面. 這主要是由于, ASP.NET 順序執(zhí)行可以讀寫 Session 的頁面:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="FileUpload.aspx.cs" Inherits="uploader_FileUpload"
EnableSessionState="ReadOnly" %>
調(diào)用 Uploader 的 Save 方法
在保存頁面的 Page_Load 方法中, 調(diào)用 Uploader 控件的 Save靜態(tài)方法來保存文件:
protected void Page_Load ( object sender, EventArgs e )
{
if ( this.IsPostBack && this.file.HasFile )
// TODO: 這里設(shè)置 waitSecond 參數(shù)是為了在測試時顯示上傳的進度,
// 在實際的使用中請不要設(shè)置 waitSecond, 并調(diào)整 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 參數(shù)是文件保存的完整路徑, postedFile 參數(shù)是提供文件控制的 HttpPostedFile 對象, 可以從 FileUpload 控件獲取, uploadInfo 參數(shù)是保存上傳進度信息的對象, bufferSize 參數(shù)是保存文件時的緩存大小, 默認 128kb 保存一次, 最后一個參數(shù) waitSecond 只在測試時使用, 表示緩存被保存后的等待時間, 這樣可以確??吹竭M度.
上傳大于 4mb 的文件, 請修改 web.config 的 maxRequestLength, 可以參考 http://msdn.microsoft.com/zh-cn/library/e1f13641(v=vs.71).aspx.
創(chuàng)建獲取進度的頁面
包含進度信息的對象 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 實現(xiàn)了接口 IReadOnlySessionState, 而不是 IRequiresSessionState. 原因也是和設(shè)置 EnableSessionState 為 ReadOnly 類似的. 至于如何返回 JSON 數(shù)據(jù), 請參考 在不同的 .NET 版本中返回 JSON.
創(chuàng)建上傳頁面
最后一步就是創(chuàng)建一個上傳頁面, 在頁面中添加 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>
設(shè)置保存頁面
通過 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>
設(shè)置獲取進度的頁面
通過屬性 ProgressUrl 和 ProgressChanged 可以獲取并顯示上傳進度, ProgressUrl 表示返回進度信息的頁面地址, ProgressChanged 則用于處理返回的進度等信息.
此外 ProgressInterval 屬性表示查詢進度的時間間隔, 默認為 1000 毫秒.
上傳
調(diào)用 uploader 的 upload方法, 即可觸發(fā)上傳操作:
<je:Button ID="cmdUpload" runat="server" IsVariable="true"
Label="開始" Click="
function(){
uploader.__uploader('upload');
}">
</je:Button>
默認情況下將對保存頁面的第一個表單執(zhí)行 submit 操作, 可以通過 UploadForm 屬性來調(diào)整需要提交的表單的索引.
隱藏保存頁面
調(diào)用 uploader 的 hide方法, 即可隱藏保存頁面:
uploader.__uploader('upload');
JQueryElement 是開源共享的代碼, 可以在 http://code.google.com/p/zsharedcode/wiki/Download 頁面下載 dll 或者是源代碼.
實際過程演示: http://www.tudou.com/programs/view/-Zvwz5xsih8/, 建議全屏觀看.
相關(guān)文章
巧妙使用JQuery Clone 添加多行數(shù)據(jù),并更新到數(shù)據(jù)庫的實現(xiàn)代碼
巧妙使用JQuery Clone 添加多行數(shù)據(jù),并更新到數(shù)據(jù)庫的實現(xiàn)代碼,需要的朋友可以參考下。2011-12-12Visual Studio 2017設(shè)置版權(quán)的方法
這篇文章主要為大家詳細介紹了Visual Studio 2017設(shè)置版權(quán)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03.NET6創(chuàng)建Windows服務(wù)的實現(xiàn)步驟
本文主要介紹了.NET6創(chuàng)建Windows服務(wù)的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06.NET C#創(chuàng)建WebService服務(wù)簡單實例
這篇文章主要為大家詳細介紹了.NET C# 創(chuàng)建WebService服務(wù)簡單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05asp.net下Response.ContentType類型匯總
asp.net下Response.ContentType類型匯總...2007-04-04asp.net web頁面元素的多語言化(多國語化)實現(xiàn)分享
開發(fā)的一些系統(tǒng),經(jīng)常要求支持多語言(例如日文,英文等),接下來介紹如何實現(xiàn)asp.net開發(fā)中web頁面實現(xiàn)頁面元素的多語言化(多國語化)感興趣的朋友可以了解下,或許對你學習有所幫助2013-02-02基于asp.net下使用jquery實現(xiàn)ajax的解決方法
本文以最簡單的方法為新手示范如何使用jquery實現(xiàn)ajax技術(shù)(所以本文是專為新手所寫,老鳥勿噴,大神此處省略一萬字)。至于什么是jquery什么是ajax,自己谷歌去2013-05-05