asp.net mvc 實(shí)現(xiàn)文件上傳帶進(jìn)度條的思路與方法
實(shí)現(xiàn)思路
ajax異步上傳文件,且開始上傳文件的時(shí)候啟動(dòng)輪詢來實(shí)時(shí)獲取文件上傳進(jìn)度。保存進(jìn)度我采用的是memcached緩存,因?yàn)轫?xiàng)目其他地方也用了的,所以就直接用這個(gè)啦。注意:不能使用session來保存進(jìn)度,因?yàn)閟ession是線程安全的不能實(shí)時(shí)獲取進(jìn)度,可是試試httpcache或者memorycache,這兩個(gè)我沒有試過,請(qǐng)自行嘗試。
ps:使用websocket來實(shí)現(xiàn)也是不錯(cuò)的,不過我沒有試過,有心的大神可以去試試。
下面貼效果圖:
實(shí)現(xiàn)方法如下
前端ajax上傳文件,我使用了兩種jq插件。一種是ajaxfileupload,一種是jquery.form.js(如需下載,請(qǐng)百度)。關(guān)于更多jQuery插件用法還可參閱本站相關(guān)專題: 《jQuery常用插件及用法總結(jié)》 。
下面的代碼是ajaxFileUpload的:
$.ajaxFileUpload ( { url: '/WxManage/Media/UploadImage', //用于文件上傳的服務(wù)器端請(qǐng)求地址 secureuri: false, //是否需要安全協(xié)議,一般設(shè)置為false fileElementId: 'postFile', //文件上傳域的ID type:"post", dataType: 'json', //返回值類型 一般設(shè)置為json success: function(data, status) //服務(wù)器成功響應(yīng)處理函數(shù) { CloseProgressbar();//關(guān)閉進(jìn)度條 設(shè)置進(jìn)度條進(jìn)度為100 if (data.status == 1) { layer.msg(data.msg, { icon: 1, time: 1000 },function() { parent.location.reload(); }); } else { $("#btnUploadFile").attr("disabled", false); layer.msg(data.msg, { icon: 2, time: 1000 }); } }, error: function(data, status, e) //服務(wù)器響應(yīng)失敗處理函數(shù) { $("#btnUploadFile").attr("disabled", false); CloseProgressbar(); layer.closeAll("dialog"); layer.msg("上傳失敗", { icon: 2, time: 1000 }); } } );
后端接收文件上傳請(qǐng)求的action:
[HttpPost] public ActionResult UploadImage(HttpPostedFileBase postFile) { if (postFile == null) { return Json(BasicConfig.MessageConfig.Fail("上傳文件不得為空")); } try { string format = postFile.FileName.Split('.').Last();//后綴名 SaveFile(postFile); return Json(BasicConfig.MessageConfig.Success("上傳成功")); } catch (Exception ex) { return Json(BasicConfig.MessageConfig.Fail("上傳失敗")); } }
SaveFile方法是保存文件的方法,采用的是文件流方式保存以便于計(jì)算上傳進(jìn)度:
核心代碼:
FileStream fs = new FileStream(fileSavePath, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); BinaryReader br = new BinaryReader(postFile[i].InputStream); int readCount = 0;//單次讀取的字節(jié)數(shù) while ((readCount = br.Read(bufferByte, 0, readBufferSize)) > 0) { bw.Write(bufferByte, 0, readCount);//寫入字節(jié)到文件流 bw.Flush(); saveCount += readCount;//已經(jīng)上傳的進(jìn)度 mem.SetValue("Admin_UploadSpeed_" + Session.SessionID, (saveCount * 1.0 / totalCount).ToString("0.00"), 60);//將更新到memcached緩存中 Thread.Sleep(200);//為了看到明顯的過程故意暫停 }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- ASP.NET MVC實(shí)現(xiàn)批量文件上傳
- ASP.NET MVC HttpPostedFileBase文件上傳的實(shí)例代碼
- asp.net core mvc實(shí)現(xiàn)文件上傳實(shí)例
- 解決ASP.NET Core Mvc文件上傳限制問題實(shí)例
- asp.net中MVC借助Iframe實(shí)現(xiàn)無刷新上傳文件實(shí)例
- Asp.net實(shí)現(xiàn)MVC處理文件的上傳下載功能實(shí)例教程
- ASP.NET MVC處理文件上傳的小例子
- 用Html5與Asp.net MVC上傳多個(gè)文件的實(shí)現(xiàn)代碼
- ASP.NET?MVC使用JSAjaxFileUploader插件實(shí)現(xiàn)單文件上傳
相關(guān)文章
ASP.NET中的跳轉(zhuǎn) 200, 301, 302轉(zhuǎn)向?qū)崿F(xiàn)代碼
跳轉(zhuǎn)非常常用,在哪里都一樣,這里的一些說明和用法也如此,不止適用于asp.net,其他語言也會(huì)用得到。跳轉(zhuǎn)的目的本來很簡(jiǎn)單,就是當(dāng)用戶或系統(tǒng)需要時(shí)從一個(gè)頁面轉(zhuǎn)向另一個(gè)頁面,但自從有了各種各樣的需求,還有那個(gè)什么SEO的東西之后,跳轉(zhuǎn)被搞得極其復(fù)雜2008-09-09詳解Spring Boot 中使用 Java API 調(diào)用 lucene
這篇文章主要介紹了詳解Spring Boot 中使用 Java API 調(diào)用 lucene,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11.net core版 文件上傳/ 支持批量上傳拖拽及預(yù)覽功能(bootstrap fileinput上傳文件)
本篇內(nèi)容主要解決.net core中文件上傳的問題 開發(fā)環(huán)境:ubuntu+vscode.本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2017-03-03設(shè)置默認(rèn)Ajax操作cache and error
設(shè)置默認(rèn)Ajax操作cache and error,需要的朋友可以參考一下2013-02-02.NET 日志系統(tǒng)設(shè)計(jì)思路及實(shí)現(xiàn)代碼
這篇文章主要介紹了.NET 日志系統(tǒng)設(shè)計(jì)思路及實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-12-12asp.net下將純真IP數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中的代碼
純真IP數(shù)據(jù)庫包含最新的IP信息,通過IP我們可以查詢?cè)L問者的來路,地理位置!但下載下來的IP數(shù)據(jù)無法被我們直接調(diào)用,所以我們需要編寫代碼將IP寫入到數(shù)據(jù)庫中供我們使用!2011-01-01ASP.NET Core擴(kuò)展庫之實(shí)體映射使用詳解
這篇文章主要介紹了ASP.NET Core擴(kuò)展庫之實(shí)體映射使用詳解,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下2021-03-03