asp.net mvc 實現(xiàn)文件上傳帶進度條的思路與方法
實現(xiàn)思路
ajax異步上傳文件,且開始上傳文件的時候啟動輪詢來實時獲取文件上傳進度。保存進度我采用的是memcached緩存,因為項目其他地方也用了的,所以就直接用這個啦。注意:不能使用session來保存進度,因為session是線程安全的不能實時獲取進度,可是試試httpcache或者memorycache,這兩個我沒有試過,請自行嘗試。
ps:使用websocket來實現(xiàn)也是不錯的,不過我沒有試過,有心的大神可以去試試。
下面貼效果圖:

實現(xiàn)方法如下
前端ajax上傳文件,我使用了兩種jq插件。一種是ajaxfileupload,一種是jquery.form.js(如需下載,請百度)。關(guān)于更多jQuery插件用法還可參閱本站相關(guān)專題: 《jQuery常用插件及用法總結(jié)》 。
下面的代碼是ajaxFileUpload的:
$.ajaxFileUpload
(
{
url: '/WxManage/Media/UploadImage', //用于文件上傳的服務(wù)器端請求地址
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)閉進度條 設(shè)置進度條進度為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 });
}
}
);
后端接收文件上傳請求的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方法是保存文件的方法,采用的是文件流方式保存以便于計算上傳進度:
核心代碼:
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)上傳的進度
mem.SetValue("Admin_UploadSpeed_" + Session.SessionID, (saveCount * 1.0 / totalCount).ToString("0.00"), 60);//將更新到memcached緩存中
Thread.Sleep(200);//為了看到明顯的過程故意暫停
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
支持ASP.NET MVC、WebFroM的表單驗證框架ValidationSuar使用介紹
這篇文章主要介紹了支持ASP.NET MVC、WebFroM的表單驗證框架ValidationSuar使用介紹,本文詳細講解了使用步驟,并給出一個完整Demo下載,需要的朋友可以參考下2015-06-06
Visual Studio實現(xiàn)xml文件使用app.config、web.config等的智能提示
這篇文章主要為大家詳細介紹了Visual Studio中xml文件使用app.config、web.config等的智能提示方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
asp.net“服務(wù)器應(yīng)用程序不可用” 解決方法
服務(wù)器應(yīng)用程序不可用 您試圖在此 Web 服務(wù)器上訪問的 Web 應(yīng)用程序當前不可用。請點擊 Web 瀏覽器中的“刷新”按鈕重試您的請求。 管理員注意事項: 詳述此特定請求失敗原因的錯誤消息可在 Web 服務(wù)器的系統(tǒng)事件日志中找到。請檢查此日志項以查明導致該錯誤發(fā)生的原因。2008-10-10
讀取XML并綁定至RadioButtonList實現(xiàn)思路及演示動畫
讀取XML的文檔,可以使用System.Data.DataSet類別中的ReadXml()方法,在aspx網(wǎng)頁上拉一個RadioButtonList控件,用來顯示XML的數(shù)據(jù),接下來,用DataSet去讀取剛才寫好的獲取XML文件的屬性,即可完成2013-01-01
.NETCore基于RabbitMQ實現(xiàn)延時隊列的兩方法
這篇文章主要介紹了.NETCore基于RabbitMQ實現(xiàn)延時隊列的兩方法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
讓GridView只更新某些特定的數(shù)據(jù)的方法
我又不希望所有的數(shù)據(jù)都可以修改,只希望修改某些特定的列,用下面的方法即可2008-10-10
關(guān)于服務(wù)器或虛擬主機不支持 AjaxPro 的問題終極解決方法
asp.net的網(wǎng)站,訪問時提示不支持 AjaxPro,那就因為誤刪的映射導致,可以通過下面的方法解決2012-03-03
ASP.NET MVC制作404跳轉(zhuǎn)實例(非302和200)
本篇文章主要介紹了ASP.NET MVC制作404跳轉(zhuǎn)實例(非302和200) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
.Net Core下HTTP請求IHttpClientFactory示例詳解
這篇文章主要給大家介紹了關(guān)于.Net Core下HTTP請求IHttpClientFactory的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用.Net Core具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09

