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(如需下載,請百度)。關于更多jQuery插件用法還可參閱本站相關專題: 《jQuery常用插件及用法總結》 。
下面的代碼是ajaxFileUpload的:
$.ajaxFileUpload
(
{
url: '/WxManage/Media/UploadImage', //用于文件上傳的服務器端請求地址
secureuri: false, //是否需要安全協(xié)議,一般設置為false
fileElementId: 'postFile', //文件上傳域的ID
type:"post",
dataType: 'json', //返回值類型 一般設置為json
success: function(data, status) //服務器成功響應處理函數(shù)
{
CloseProgressbar();//關閉進度條 設置進度條進度為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) //服務器響應失敗處理函數(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;//已經上傳的進度
mem.SetValue("Admin_UploadSpeed_" + Session.SessionID, (saveCount * 1.0 / totalCount).ToString("0.00"), 60);//將更新到memcached緩存中
Thread.Sleep(200);//為了看到明顯的過程故意暫停
}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
ASP.NET中的跳轉 200, 301, 302轉向實現(xiàn)代碼
跳轉非常常用,在哪里都一樣,這里的一些說明和用法也如此,不止適用于asp.net,其他語言也會用得到。跳轉的目的本來很簡單,就是當用戶或系統(tǒng)需要時從一個頁面轉向另一個頁面,但自從有了各種各樣的需求,還有那個什么SEO的東西之后,跳轉被搞得極其復雜2008-09-09
詳解Spring Boot 中使用 Java API 調用 lucene
這篇文章主要介紹了詳解Spring Boot 中使用 Java API 調用 lucene,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
.net core版 文件上傳/ 支持批量上傳拖拽及預覽功能(bootstrap fileinput上傳文件)
本篇內容主要解決.net core中文件上傳的問題 開發(fā)環(huán)境:ubuntu+vscode.本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2017-03-03
.NET 日志系統(tǒng)設計思路及實現(xiàn)代碼
這篇文章主要介紹了.NET 日志系統(tǒng)設計思路及實現(xiàn)代碼,有需要的朋友可以參考一下2013-12-12
asp.net下將純真IP數(shù)據(jù)導入數(shù)據(jù)庫中的代碼
純真IP數(shù)據(jù)庫包含最新的IP信息,通過IP我們可以查詢訪問者的來路,地理位置!但下載下來的IP數(shù)據(jù)無法被我們直接調用,所以我們需要編寫代碼將IP寫入到數(shù)據(jù)庫中供我們使用!2011-01-01

