婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路

Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路

熱門標簽:五常地圖標注 智能電話營銷外呼系統 萊蕪外呼電銷機器人價格 凱立德導航官網地圖標注 長春呼叫中心外呼系統哪家好 戶外地圖標注軟件手機哪個好用 地圖標注和認領 電銷語音自動機器人 鄭州400電話辦理 聯通

相信通過Asp.Net的服務器控件上傳文件在簡單不過了,通過AjaxToolkit控件實現上傳進度也不是什么難事,為什么還要自己辛辛苦苦來 實現呢?我并不否認”拿來主義“,只是我個人更喜歡凡是求個所以然。本篇將闡述通過Html,IHttpHandler和 IHttpAsyncHandler實現文件上傳和上傳進度的原理,希望對你有多幫助。

效果圖:

本文涉及到的知識點:
1.前臺用到Html,Ajax,JQuery,JQuery UI

2.后臺用到一般處理程序(IHttpHandler)和一般異步處理程序(IHttpAsyncHandler),并涉及到”推模式“

一、創建Html網頁
1、在創建的Web工程中添加一個Html文件,命名為UploadFile.htm,在頭文件中引入JQuery,JQuery UI

復制代碼 代碼如下:

link href="Styles/jquery-ui-1.8.16.custom.css" rel="stylesheet" type="text/css" />
    script src="Scripts/jquery-1.6.2.min.js" type="text/javascript">/script>
    script src="Scripts/jquery-ui-1.8.16.custom.min.js" type="text/javascript">/script>

2、關于無刷新文件上傳

通過Ajax是不能上傳文件的,無刷新上傳是靠隱藏的iframe來實現的

復制代碼 代碼如下:

form id="form" target = "frameFileUpload" enctype="multipart/form-data">
div id="progressBar" style="font-size: 1em;">/div>
input type="file" id="fileUpload" name="fileUpload" />span id="progressValue">/span>
iframe id="frameFileUpload" name="frameFileUpload" style="display:none;" >/iframe>
br />
input type="submit" value="上傳" id = "submit"/>
/form>

要將form標簽的target屬性設置為iframe的id,當然別忘了將form的enctype設置為multipart/form-data
復制代碼 代碼如下:

div id="progressBar" style="font-size: 1em;">/div>

是用來顯示上傳文件時的進度條

在JS中加入如下處理:

復制代碼 代碼如下:

    script type="text/javascript">
        $(function () {
            $("#submit").button();
            $("#fileUpload").button();
        });
    /script>

此時效果:

二、實現文件上傳
添加一個一般處理程序,命名為UploadFileHandler.ashx

復制代碼 代碼如下:

        public void ProcessRequest(HttpContext context)
        {
            //如果提交的文件名是空,則不處理
            if (context.Request.Files.Count == 0 || string.IsNullOrWhiteSpace(context.Request.Files[0].FileName))
                return;
            //獲取文件流
            Stream stream = context.Request.Files[0].InputStream;
            //獲取文件名稱
            string fileName = Path.GetFileName(context.Request.Files[0].FileName);
            //聲明字節數組
            byte[] buffer;
            //為什么是4096呢?這是操作系統中最小的分配空間,如果你的文件只有100個字節,其實它占用的空間是4096個字節
            int bufferSize = 4096;
            //獲取上傳文件流的總長度
            long totalLength = stream.Length;
            //已經寫入的字節數,用于做上傳的百分比
            long writtenSize = 0;
            //創建文件
            using (FileStream fs = new FileStream(@"C:\" + fileName, FileMode.Create, FileAccess.Write))
            {
                //如果寫入文件的字節數小于上傳的總字節數,就一直寫,直到寫完為止
                while (writtenSize totalLength)
                {
                    //如果剩余的字節數不小于最小分配空間
                    if (totalLength - writtenSize >= bufferSize)
                    {
                        //用最小分配空間創建新的字節數組
                        buffer = new byte[bufferSize];
                    }
                    else
                        //用剩余的字節數創建字節數組
                        buffer = new byte[totalLength - writtenSize];
                    //讀取上傳的文件到字節數組
                    stream.Read(buffer, 0, buffer.Length);
                    //將讀取的字節數組寫入到新建的文件流中
                    fs.Write(buffer, 0, buffer.Length);
                    //增加寫入的字節數
                    writtenSize += buffer.Length;
                    //計算當前上傳文件的百分比
                    long percent = writtenSize * 100 / totalLength;
                }
            }
        }

在form中添加action和method屬性,修改之后的
復制代碼 代碼如下:

form action="UploadFileHandler.ashx" method="post" id="form" target = "frameFileUpload" enctype="multipart/form-data">

這樣文件上傳就完成了。

三、實現文件上傳的進度顯示
我的思路:

  文件上傳的處理過程中,是不可以在處理過程中將信息傳回客戶端的,只有當所有的處理都完畢之后才會傳回客戶端,所以如果是在上面的處理程序中寫 入context.Response.Write(percent);是不可能得到處理的過程,只能等到處理結束后,客戶端一次性得到所有的值。

  要想得到處理過程中的值,我的解決是這樣,在文件上傳時,要開啟另一個請求,來獲取進度信息。而這個請求是異步的,我指的是客戶端異步請求和服 務端異步處理。因為要涉及到兩個不同的請求處理程序之間信息的傳遞,將"處理文件上傳的程序"得到的進度信息傳遞給"處理進度請求的程序",而"處理進度 請求的處理程序"要依賴于"處理文件上傳的處理程序"。處理圖:

  首先客戶端同時(幾乎是)發出兩個請求,一個是文件上傳,一個是進度請求。由于"處理請求進度的程序"是異步處理的,當該程序沒有信息發給客戶 端時,我們讓它處于等待狀態,這里有點像Tcp,這樣客戶端跟服務器就一直處于連接狀態。當"處理文件上傳的程序"開始處理時,通過把進度值賦值給"處理 請求進度程序"的異步操作的狀態,并觸發"處理請求進度的程序"返回值給客戶端。客戶端獲取進度值,并處理。這樣一次請求進度值的請求就結束了,我們知道 服務器是不會主動給客戶端發送信息的,只有客戶端請求,服務器才會響應。顯然,要想在文件保存的過程中向客戶端發送進度信息,客戶端得到每得到一個返回結 果,都是一次請求。為了得到連續的請求值,客戶端再向"處理請求進度的程序"發出請求,依次循環,知道文件上傳結束。

技術實現:
  異步處理用到接口IHttpAsyncHandler,新建一個一般處理程序,命名為RequestProgressAsyncHandler.ashx,將默認的接口改為IHttpAsyncHandler

復制代碼 代碼如下:

    public class RequestProgressAsyncHandler : IHttpAsyncHandler
    {
        public void ProcessRequest(HttpContext context)
        {
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
        #region IHttpAsyncHandler 成員
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            throw new NotImplementedException();
        }
        public void EndProcessRequest(IAsyncResult result)
        {
            throw new NotImplementedException();
        }
        #endregion
    }

BeginProcessRequest和EndProcessRequest是兩個核心的方法,其他的兩個不用處理。當該處理程序處理請求 時,BeginProcessRequest是第一個被調用的函數,返回一個包含異步狀態信息的對象,該對象是IAsyncResult類型,是實現異步 的關鍵,用于控制什么時候調用EndProcessRequest來結束處理程序的等待狀態,BeginProcessRequest被調用之后,程序就 處于等待狀態。EndProcessRequest是在結束請求時的處理函數,通過該函數可以向客戶端寫入信息。

實現接口IAsyncResult

復制代碼 代碼如下:

    public class AsyncResult : IAsyncResult
    {
        // 標示異步處理的狀態
        private bool isComplete = false;

        //保存異步處理程序中的Http上下文
        private HttpContext context;

        //異步回調的委托
        private AsyncCallback callback;
        /// summary>
        /// 獲取或設置保存下載文件的百分比數值部分
        /// /summary>
        public long PercentNumber;

        public AsyncResult(HttpContext context, AsyncCallback callback)
        {
            this.context = context;
            this.callback = callback;
        }
        /// summary>
        /// 向客戶端寫入信息
        /// /summary>
        public void Send()
        {
            this.context.Response.Write(PercentNumber);
        }
        /// summary>
        /// 完成異步處理,結束請求
        /// /summary>
        public void DoCompleteTask()
        {
            if (callback != null)
                callback(this);//會觸發處理程序中的EndProcessRequest函數,結束請求
            this.isComplete = true;
        }
        #region IAsyncResult 成員

        public object AsyncState
        {
            get { return null; }
        }

        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get { return null; }
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }

        public bool IsCompleted
        {
            get { return isComplete; }
        }

        #endregion

    }


修改 RequestProgressAsyncHandler.ashx文件:
復制代碼 代碼如下:

    public class RequestProgressAsyncHandler : IHttpAsyncHandler
    {
        /// summary>
        /// 保存異步處理狀態信息的集合
        /// /summary>
        public static ListAsyncResult> AsyncResults = new ListAsyncResult>();
        public void ProcessRequest(HttpContext context)
        {
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
        #region IHttpAsyncHandler 成員

        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {

            AsyncResult result = new AsyncResult(context, cb);
            AsyncResults.Add(result);
            return result;
        }

        public void EndProcessRequest(IAsyncResult result)
        {
            //保證集合中只用一個元素
            AsyncResults.Clear();
            AsyncResult ar = (AsyncResult)result;
            ar.Send();
        }

        #endregion
    }


在UploadFileHandler.ashx添加如下代碼:
復制代碼 代碼如下:

        private static void SendPercentToClient(long percent)
        {
            //當上傳完畢后,保證處理程序能向客戶端傳回
            while (RequestProgressAsyncHandler.AsyncResults.Count == 0 percent == 100)
            {

            }
            //因為本處理程序和"處理請求進度的程序"是并發的,不能保證RequestProgressAsyncHandler.AsyncResults一定含有子項
            if (RequestProgressAsyncHandler.AsyncResults.Count != 0)
            {
                RequestProgressAsyncHandler.AsyncResults[0].PercentNumber = percent;
                RequestProgressAsyncHandler.AsyncResults[0].DoCompleteTask();
            }
        }


在函數ProcessRequest中加入以上方法:
復制代碼 代碼如下:

             ...
                     ...
             //計算當前上傳文件的百分比
                    long percent = writtenSize * 100 / totalLength;

                    SendPercentToClient(percent);


服務端OK!修改客戶端,添加JS處理函數:
復制代碼 代碼如下:

        function RequestProgress() {
            $.post("RequestProgressAsyncHandler.ashx", function (data, status) {
                if (status == "success") {
                    $("#progressValue").text(data + "%");
                    data = parseInt(data);
                    $("#progressBar").progressbar({ value: data });//JQuery UI 設置進度條值
                    //如果進度不是 100,則重新請求
                    if (data != 100) {
                        RequestProgress();
                    }
                }
            });
        }

在form中添加事件omsubmit的處理函數為RequestProgress
復制代碼 代碼如下:

form action="UploadFileHandler.ashx" onsubmit = "RequestProgress();" method="post" id="form" target = "frameFileUpload" enctype="multipart/form-data">

補充幾點:
1.默認Asp.Net允許的上傳文件的大小是4M,可以在Web.config中修改其大小限制
復制代碼 代碼如下:

    system.web>
        httpRuntime maxRequestLength="444444"/>
    /system.web>

maxRequestLength的單位是KB

2.在IE 8.0測試中,在文件上傳完畢后,狀態欄還處于請求中

反正不是后臺還在請求,這個放心,只要把鼠標在按鈕和瀏覽上面來回移動幾下就沒了,可能是JQuery UI 的問題。FF和Chrom下沒這個問題,就是顯示效果會有點差,但是上傳沒問題的。

源代碼下載:UploadFileDemo.rar

您可能感興趣的文章:
  • ASP.NET實現進度條效果
  • asp.net mvc 實現文件上傳帶進度條的思路與方法
  • asp.net文件上傳帶進度條實現案例(多種風格)
  • asp.net單文件帶進度條上傳的解決方案
  • asp.net(c#)開發中的文件上傳組件uploadify的使用方法(帶進度條)
  • asp.net 在客戶端顯示服務器端任務處理進度條的探討
  • asp.net 生成靜態頁時的進度條顯示
  • Asp.net基于ajax和jquery-ui實現進度條

標簽:岳陽 西寧 西藏 紅河 衢州 宣城 湖州 福州

巨人網絡通訊聲明:本文標題《Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路》,本文關鍵詞  Asp.Net,無,刷新,文件,上傳,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路》相關的同類信息!
  • 本頁收集關于Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲国产欧美在线人成| 国产欧美日韩三区| 3atv在线一区二区三区| 亚洲精品国产a| 成人久久视频在线观看| 国产免费成人在线视频| 成人免费视频一区| 成人欧美一区二区三区视频网页| www.成人在线| 最新国产精品久久精品| 91色九色蝌蚪| 午夜免费欧美电影| 日韩欧美亚洲国产精品字幕久久久| 日韩国产成人精品| 日韩欧美一区中文| 国产精品自拍网站| 国产精品成人免费在线| 色婷婷激情一区二区三区| 亚洲电影一区二区三区| 日韩欧美自拍偷拍| 丁香婷婷综合网| 亚洲免费在线播放| 欧美一级精品在线| 高清不卡在线观看av| 亚洲综合色婷婷| 精品国产成人系列| 成人黄色软件下载| 亚洲午夜私人影院| 精品久久久久久最新网址| 成人午夜在线视频| 日韩av网站免费在线| 中日韩av电影| 欧美日韩三级一区| 国产精品一区二区无线| 亚洲小说春色综合另类电影| 久久蜜桃av一区二区天堂| 欧美吻胸吃奶大尺度电影| 国产黄色91视频| 亚洲成av人影院在线观看网| 国产精品美女久久久久高潮| 91精品国产综合久久久久久久| 国产乱码精品一品二品| 五月天国产精品| 国产精品三级电影| 日韩一区国产二区欧美三区| 色综合久久88色综合天天免费| 激情亚洲综合在线| 天天综合天天综合色| 亚洲日本一区二区| 国产亚洲人成网站| 8x8x8国产精品| 色视频成人在线观看免| 成人av电影在线| 成人国产精品免费观看动漫| 国内精品伊人久久久久av一坑| 亚洲va天堂va国产va久| 亚洲免费在线播放| 中文字幕一区二区三区在线观看| 久久免费视频一区| 精品国产乱码久久久久久牛牛| 在线免费观看一区| 波多野结衣中文字幕一区| 国产成人精品午夜视频免费 | 91精品国产综合久久久久久漫画| 成人一区在线观看| 精久久久久久久久久久| 一区二区三区欧美在线观看| 亚洲啪啪综合av一区二区三区| 欧美高清在线一区二区| 国产日本欧洲亚洲| 欧美经典一区二区| 国产精品免费免费| 国产精品久久免费看| 亚洲美女电影在线| 亚洲精品乱码久久久久久| 亚洲综合视频在线| 日韩**一区毛片| 捆绑紧缚一区二区三区视频| 老司机午夜精品| 国产精品538一区二区在线| 国产成人aaa| 91小宝寻花一区二区三区| 91小宝寻花一区二区三区| 欧洲国内综合视频| 91麻豆精品国产91久久久久久 | 亚洲成人av一区| 亚洲图片欧美综合| 美女精品一区二区| 国产成人午夜精品影院观看视频| 风间由美一区二区av101| 99国产精品久| 欧美精品粉嫩高潮一区二区| 日韩久久精品一区| 国产精品毛片a∨一区二区三区| 亚洲日本电影在线| 天天色 色综合| 视频一区欧美日韩| 国产麻豆视频精品| 色哟哟一区二区在线观看| 欧美一区二区精品| 久久久久亚洲综合| 一级精品视频在线观看宜春院| 看国产成人h片视频| 91影院在线免费观看| 97久久久精品综合88久久| 欧美在线观看视频在线| 国产日韩欧美高清| 悠悠色在线精品| 蜜臀精品一区二区三区在线观看 | 国产欧美精品在线观看| 亚洲电影激情视频网站| 国产91在线观看| 欧美美女激情18p| 欧美tickling挠脚心丨vk| 国产精品久久久久久妇女6080| 亚洲午夜国产一区99re久久| 国产一区二区日韩精品| 91香蕉视频黄| 久久久99精品久久| 美女被吸乳得到大胸91| 日韩av二区在线播放| 91网页版在线| 久久久精品国产99久久精品芒果| 亚洲综合一二区| 91网站最新网址| 欧美精品一区二区三区四区| 亚洲成人1区2区| 99久久精品99国产精品| 欧美日韩夫妻久久| 亚洲男人的天堂av| 99久久777色| 精品欧美乱码久久久久久1区2区| 国产精品久久久久久久久免费樱桃| 韩国女主播一区| 欧美美女黄视频| 蜜臀av性久久久久av蜜臀妖精| 97久久精品人人做人人爽| 中文字幕av一区 二区| 久久精品99国产精品| 欧美色图一区二区三区| 亚洲综合免费观看高清完整版| 丰满放荡岳乱妇91ww| 日韩欧美国产综合| 久久av老司机精品网站导航| 欧美最猛黑人xxxxx猛交| 亚洲国产综合在线| 色综合久久久久久久久| 日本一区二区三区四区| 精品一区二区久久| 欧美二区在线观看| 欧美aⅴ一区二区三区视频| 日韩女优毛片在线| 亚洲一卡二卡三卡四卡五卡| 欧美亚洲另类激情小说| 亚洲欧美另类图片小说| 91日韩精品一区| 亚洲欧洲精品一区二区三区| av在线一区二区| 国产午夜精品美女毛片视频| 国产成人在线视频网址| 国产无一区二区| 91农村精品一区二区在线| 国产日本一区二区| 欧美做爰猛烈大尺度电影无法无天| 亚洲成人福利片| 欧美一区二区女人| 免费在线观看视频一区| 精品久久国产老人久久综合| 美洲天堂一区二卡三卡四卡视频| 亚洲精品一区二区三区99| 不卡的电影网站| 亚洲欧美另类图片小说| 欧美日韩一区二区欧美激情| 日韩va亚洲va欧美va久久| 欧美一区二区播放| 成人免费高清视频在线观看| 中文字幕第一区| 91网页版在线| 极品少妇一区二区| 亚洲欧洲国产日韩| 欧美无乱码久久久免费午夜一区 | 天天影视涩香欲综合网| 久久久久久久久久久黄色| 久久精品国产精品青草| 国产性色一区二区| 日本久久电影网| 久久精品国产久精国产| 一区二区高清在线| 日韩视频一区二区在线观看| 成人美女在线视频| 丝袜a∨在线一区二区三区不卡| 欧美精品一区二区三| 欧美人体做爰大胆视频| 北条麻妃国产九九精品视频| 夜夜嗨av一区二区三区网页| 国产精品毛片久久久久久久| 欧美tk—视频vk| 欧美午夜不卡在线观看免费| 不卡电影一区二区三区| 精品综合久久久久久8888|