轉(zhuǎn)帖|其它|編輯:郝浩|2011-09-23 14:15:55.000|閱讀 1428 次
概述:最近在做asp.net mvc 大文件上傳,但是每次大文件上傳的響應(yīng)時間都很長,沒有提示就給不了用戶良好的體驗(yàn),所以想了想還是必須在文件上傳時顯示進(jìn)度條,但是asp.net默認(rèn)的文件上傳管道是無法顯示進(jìn)度條的。所以就必須自己手動創(chuàng)建一個接收管道。實(shí)現(xiàn)的方式有2種,一種是寫一個類繼承IHttpModule接口然后實(shí)現(xiàn)其中的方法,還有一種就是直接在Global.asax里面的Application_BeginRequest寫上傳文件的方法。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
最近在做asp.net mvc 大文件上傳,但是每次大文件上傳的響應(yīng)時間都很長,沒有提示就給不了用戶良好的體驗(yàn),所以想了想還是必須在文件上傳時顯示進(jìn)度條,但是asp.net默認(rèn)的文件上傳管道是無法顯示進(jìn)度條的。所以就必須自己手動創(chuàng)建一個接收管道。實(shí)現(xiàn)的方式有2種,一種是寫一個類繼承IHttpModule接口然后實(shí)現(xiàn)其中的方法,還有一種就是直接在Global.asax里面的Application_BeginRequest寫上傳文件的方法。
在寫文件接收方法的時候應(yīng)該分塊來接收文件,然后在同時保存文件的狀態(tài),這時候就要注意如何保存文件的狀態(tài),以便客戶端獲取,我想了幾種方式總結(jié)出來
1、可以使用Application變量。Application對象的作用范圍是整個全局,也就是說對所有用戶都有效。其常用的方法用Lock和UnLock。
view sourceprint?
1 Application.Lock();
2
3 Application["GUID"]=upload;
4
5 Application.UnLock();
2、使用Session變量。想必這個肯定是大家使用中最常見的用法了,其操作與Application類似,作用于用戶個人,所以,過量的存儲會導(dǎo)致服務(wù)器內(nèi)存資源的耗盡。
view sourceprint?
1 Session["GUID"]=upload;
3、使用Cookie變量。這個也是大家常使用的方法,與Session一樣,其實(shí)是對每一個用戶而言的,但是他們有個本質(zhì)的區(qū)別,即Cookie 是存放在客戶端的,而Session是存放在服務(wù)器端的。而且Cookie的使用要配合ASP.NET內(nèi)置對象Request來調(diào)用。
view sourceprint?
1 HttpCookie myCookie = new HttpCookie(cookieName);
2 myCookie = HttpContext.Current.Request.Cookies[cookieName];
3 HttpContext.Current.Response.Cookies.Add(myCookie);
4 HttpCookie myCookie = new HttpCookie(cookieName);
5 myCookie = HttpContext.Current.Request.Cookies[cookieName];
4、使用Cache,但是.NET中Cache有兩種調(diào)用方式:HttpContext.Current.Cache 和 HttpRuntime.Cache。下面的是MSDN的解釋。
HttpContext.Current.Cache:為當(dāng)前 HTTP 請求獲取Cache對象。
HttpRuntime.Cache:獲取當(dāng)前應(yīng)用程序的Cache。
HttpContext:封裝有關(guān)個別HTTP請求的所有HTTP特定的信息,HttpContext.Current為當(dāng)前的HTTP請求獲取HttpContext對象。
HttpRuntime:為當(dāng)前應(yīng)用程序提供一組ASP.NET運(yùn)行時服務(wù)。
其實(shí)HttpRuntime.Cache相當(dāng)于就是一個緩存具體實(shí)現(xiàn)類,這個類雖然被放在了System.Web命名空間下,但是非Web應(yīng)用下也是可以使用;HttpContext.Current.Cache是對上述緩存類的封裝,由于封裝到了HttpContext類中,局限于只能在知道 HttpContext下使用,即只能用于Web應(yīng)用。
既然我們這邊是采用mvc3是web應(yīng)用程序,那我們就都可以使用,但是我建議既然是web應(yīng)用程序還是使用HttpContext.Current.Cache.
view sourceprint?
1 HttpContext.Current.Cache[Guid]
以上4種都可以算是全局變量,但是有的并不是很好的方案,建議使用第一種和第四種來存儲數(shù)據(jù)。我是采用Cache來存儲文件進(jìn)度的信息的。
這時候又有一個問題了。我們應(yīng)該怎么知道當(dāng)前上傳的是什么應(yīng)用程序呢?我使用的是GUID來標(biāo)識,這樣上傳上來的程序就有唯一的標(biāo)識符了。多個用戶同時上傳也不會有問題了。
在客戶端方面我采用了Jquery 版本號 1.64 、 jquery.blockUI.js 版本號 1.23、 jquery.form.js 版本號 2.84 、jquery-ui.js 版本號 1.8.16
用jquery.blockUI來實(shí)現(xiàn)彈出層,jquery.form用來提交數(shù)據(jù),Jquery 的$.ajax方法來獲取當(dāng)前文件進(jìn)度的狀態(tài)Json,jquery-ui來實(shí)現(xiàn)進(jìn)度條信息。
下面是MVC3大文件上傳的截圖,這篇文章主要是討論文件上傳實(shí)現(xiàn)進(jìn)度條的思路并沒有提供demo進(jìn)行下載有什么問題可以留言。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載