<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        asp.net下大文件上傳知識整理

        來源:懂視網 責編:小采 時間:2020-11-27 22:45:32
        文檔

        asp.net下大文件上傳知識整理

        asp.net下大文件上傳知識整理:最近做在做ePartner項目,涉及到文件上傳的問題。 以前也做過文件上傳,但都是些小文件,不超過2M。 這次要求上傳100M以上的東西。 沒辦法找來資料研究了一下?;赪EB的文件上傳可以使用FTP和HTTP兩種協議,用FTP的話雖然傳輸穩定,但安全性是個嚴重的問題,
        推薦度:
        導讀asp.net下大文件上傳知識整理:最近做在做ePartner項目,涉及到文件上傳的問題。 以前也做過文件上傳,但都是些小文件,不超過2M。 這次要求上傳100M以上的東西。 沒辦法找來資料研究了一下?;赪EB的文件上傳可以使用FTP和HTTP兩種協議,用FTP的話雖然傳輸穩定,但安全性是個嚴重的問題,

        最近做在做ePartner項目,涉及到文件上傳的問題。 以前也做過文件上傳,但都是些小文件,不超過2M。 這次要求上傳100M以上的東西。 沒辦法找來資料研究了一下。基于WEB的文件上傳可以使用FTP和HTTP兩種協議,用FTP的話雖然傳輸穩定,但安全性是個嚴重的問題,而且FTP服務器讀用戶庫獲取權限,這樣對于用戶使用來說還是不太方便。 剩下只有HTTP。在HTTP中有3種方式,PUT、WEBDAV、RFC1867,前2種方法不適合大文件上傳,目前我們使用的web上傳都是基于RFC1867標準的HTML中基于表單的文件上傳。
        一、先簡要介紹一下RFC1867(Form-based File Upload in HTML)標準:
        1.帶有文件提交功能的HTML表單
        現有的HTML規范為INPUT元素的TYPE屬性定義了八種可能的值,分別是:CHECKBOX, HIDDEN, IMAGE, PASSWORD,  RADIO, RESET, SUBMIT, TEXT. 另外,當表單采用POST方式的時候,表單默認的具有"application/x-www -form-urlencoded" 的ENCTYPE屬性。
        RFC1867標準對HTML做出了兩處修改:
        1)為INPUT元素的TYPE屬性增加了一個FILE選項。
        2)INPUT標記可以具有ACCEPT屬性,該屬性能夠指定可被上傳的文件類型或文件格式列表。
        另外,本標準還定義了一種新的MIME類型:multipart/form-data,以及當處理一個帶有ENCTYPE="multipart/form-data" 并且/或含有<INPUT type="file">的標記的表單時所應該采取的行為。
        舉例來說,當HTML表單作者想讓用戶能夠上傳一個或更多的文件時,他可以這么寫:
            <FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
        File to process: 
        <INPUT NAME="userfile1" TYPE="file">
                    <INPUT TYPE="submit" VALUE="Send File">
            </FORM>
        HTML DTD里所需要做出的改動是為InputType實體增加一個選項。此外,我們也建議用一系列用逗號分隔的文件類型來作為INPUT標記的ACCEPT屬性。
          ... (其他元素) ...
          <!ENTITY % InputType "(TEXT | PASSWORD | CHECKBOX |
                                 RADIO | SUBMIT | RESET |
                                 IMAGE | HIDDEN | FILE )">
          <!ELEMENT INPUT - 0 EMPTY>
          <!ATTLIST INPUT
                  TYPE %InputType TEXT
                  NAME CDATA #IMPLIED  -- required for all but submit and reset
                  VALUE CDATA #IMPLIED
                  SRC %URI #IMPLIED  -- for image inputs --
                  CHECKED (CHECKED) #IMPLIED
                  SIZE CDATA #IMPLIED  --like NUMBERS,
                                          but delimited with comma, not space
                  MAXLENGTH NUMBER #IMPLIED
                  ALIGN (top|middle|bottom) #IMPLIED
                  ACCEPT CDATA #IMPLIED --list of content types
                  >
          ... (其他元素) ...
        2.文件傳輸延遲
        在某些情況下,在確實準備接受數據前,服務器先對表單數據中的某些元素(比如說用戶名,賬號等)進行驗證是推薦的做法。但是,經過一定的考慮后,我們認為如果服務器想這樣做的話,最好是采用一系列的表單,并將前面所驗證過的數據元素作為“隱藏”字段傳回給客戶端,或者是通過安排表單使那些需要驗證的元素先顯示出來。這樣的話,那些需要做復雜的應用的服務器可以自己維持事務處理的狀態,而那些簡單的應用的則可以實現得簡單些。
        HTTP 協議可能需要知道整個事務處理中的內容總長度。即使沒有明確要求,HTTP客戶端也應該提供上傳的所有文件的內容總長度,這樣一個繁忙的服務器就能夠判斷文件的內容是否是過大以至于將不能完整地處理,從而返回一個錯誤代碼并關閉該連接,而不用等到接受了所有的數據才進行判斷。目前一些現有的CGI應用對所有的POST事務都需要知道內容總長度。
        如果INPUT標記含有一個MAXLENGTH屬性,客戶端可以將這個屬性值看作是服務器端所能夠接受的傳送文件的最大字節數。在這種情況下,服務器能夠在上傳開始前,提示客戶端在服務器上有多少空間可以用來進行文件上傳。但是應該引起注意的是,這僅僅是一個提示,在表單被創建后和文件上傳前,服務器的實際需求可能會發生改變。
        在任何情況下,如果接受的文件過大的話,任何一個HTTP服務器都有可能在文件傳輸的過程中中斷傳輸。
        3.傳輸二進制數據的其他解決辦法
        有些人曾經建議使用一種新的MIME類型"aggregate",比如說aggregate/mixed 或是content-transfer- encoding "包"來描述那些不確定長度的二進制數據,而不是靠分解為多個部分來表示。雖然我們并不反對這么做,但這需要增加額外的設計和標準化工作來讓大家接受并理解"aggregate"。 從另一方面來說,"分解為多部分"的機制工作得很好,能夠非常簡單的在客戶發送端和服務器接受端加以實現,而且能像其他一些綜合處理二進制數據的方式一樣高效率地工作。
        4.例子
        假設服務器段提供的是如下的HTML:
             <FORM ACTION="http://server.dom/cgi/handle"
                   ENCTYPE="multipart/form-data"
                   METHOD=POST>
             What is your name? <INPUT TYPE=TEXT NAME=submitter>
             What files are you sending? <INPUT TYPE=FILE NAME=pics>
             </FORM>
        用戶在“姓名”字段里面填寫"Joe Blow",對問題'What files are you sending?',用戶選擇
        了一個文本文件"file1.txt"。
        客戶段可能發送回如下的數據:
                Content-type: multipart/form-data, boundary=AaB03x
                --AaB03x
                content-disposition: form-data; name="field1"
                Joe Blow
                --AaB03x
                content-disposition: form-data; name="pics"; filename="file1.txt"
                Content-Type: text/plain
                 ... file1.txt 的內容...
                --AaB03x--
        如果用戶同時還選擇了另一個圖片文件"file2.gif",那么客戶端可能發送的數據將是:
                Content-type: multipart/form-data, boundary=AaB03x
                --AaB03x
                content-disposition: form-data; name="field1"
                Joe Blow
                --AaB03x
                content-disposition: form-data; name="pics"
                Content-type: multipart/mixed, boundary=BbC04y
                --BbC04y
                Content-disposition: attachment; filename="file1.txt"
                Content-Type: text/plain
                ... file1.txt 的內容...
                --BbC04y
                Content-disposition: attachment; filename="file2.gif"
                Content-type: image/gif
                Content-Transfer-Encoding: binary
                  ... file2.gif的內容...
                --BbC04y--
                --AaB03x--
            二、利用RFC1867標準處理文件上傳的兩種方式:
                 1.一次性得到上傳的數據,然后分析處理。
        看了N多代碼之后發現,目前無組件程序和一些COM組件都是使用Request.BinaryRead方法。一次性得到上傳的數據,然后分析處理。這就是為什么上傳大文件很慢的原因了,IIS超時不說,就算幾百M文件上去了,分析處理也得一陣子。
                 2.一邊接收文件,一邊寫硬盤。
        了解了一下國外的商業組件,比較流行的有Power-Web,AspUpload,ActiveFile,ABCUpload, aspSmartUpload,SA-FileUp。其中比較優秀的是ASPUPLOAD和SA-FILE,他們號稱可以處理2G的文件(SA- FILE EE版甚至沒有文件大小的限制),而且效率也是非常棒,難道編程語言的效率差這么多?查了一些資料,覺得他們都是直接操作文件流。這樣就不受文件大小的制約。但老外的東西也不是絕對完美,ASPUPLOAD處理大文件后,內存占用情況驚人。1G左右都是稀松平常。至于SA-FILE雖然是好東西但是破解難尋。然后發現2款.NET上傳組件,Lion.Web.UpLoadModule和AspnetUpload也是操作文件流。但是上傳速度和 CPU占用率都不如老外的商業組件。
        做了個測試,LAN內傳1G的文件。ASPUPLOAD上傳速度平均是4.4M/s,CPU占用10 -15,內存占用700M。SA-FILE也差不多這樣。而AspnetUpload最快也只有1.5M/s,平均是700K/s,CPU占用15- 39,測試環境: PIII800,256M內存,100M LAN。我想AspnetUpload速度慢是可能因為一邊接收文件,一邊寫硬盤。資源占用低的代價就是降低傳輸速度。但也不得不佩服老外的程序,CPU占用如此之低.....
             三、ASP.NET上傳文件遇到的問題
        我們在用ASP.NET上傳大文件時都遇到過這樣或那樣的問題。設置很大的maxRequestLength值并不能完全解決問題,因為ASP.NET會 block直到把整個文件載入內存后,再加以處理。實際上,如果文件很大的話,我們經常會見到Internet Explorer顯示  "The page cannot be displayed - Cannot find server or DNS Error",好像是怎么也 catch不了這個錯誤。為什么?因為這是個client side錯誤,server side端的Application_Error是處理不到的。
             四、ASP.NET大文件上傳解決方案
        解決的方法是利用隱含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法從IIS為ASP.NET建立的pipe里分塊讀取數據。Chris Hynes為我們提供了這樣的一個方案(用HttpModule),該方案除了允許你上傳大文件外,還能實時顯示上傳進度。
                 Lion.Web.UpLoadModule和AspnetUpload 兩個.NET組件都是利用的這個方案。
                 方案原理:
        利用HttpHandler實現了類似于ISAPI Extention的功能,處理請求(Request)的信息和發送響應(Response)。
        方案要點:
        1.   httpHandler or HttpModule
        a.在asp.net進程處理request請求之前截獲request對象
        b.分塊讀取和寫入數據
        c.實時跟蹤上傳進度更新meta信息
        2.   利用隱含的HttpWorkerRequest用它的GetPreloadedEntityBody 和 ReadEntityBody方法處理文件流
        IServiceProvider provider = (IServiceProvider) HttpContext.Current; 
          HttpWorkerRequest wr = (HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));
          byte[] bs = wr.GetPreloadedEntityBody();
          ....
          if (!wr.IsEntireEntityBodyIsPreloaded())
          {
                int n = 1024;
                byte[] bs2 = new byte[n];
                while (wr.ReadEntityBody(bs2,n) >0)
               {
                     .....
                }
          }
        3.   自定義Multipart MIME 解析器
        自動截獲MIME分割符
        將文件分塊寫如臨時文件
        實時更新Appliaction 狀態(ReceivingData, Error, Complete)

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        asp.net下大文件上傳知識整理

        asp.net下大文件上傳知識整理:最近做在做ePartner項目,涉及到文件上傳的問題。 以前也做過文件上傳,但都是些小文件,不超過2M。 這次要求上傳100M以上的東西。 沒辦法找來資料研究了一下?;赪EB的文件上傳可以使用FTP和HTTP兩種協議,用FTP的話雖然傳輸穩定,但安全性是個嚴重的問題,
        推薦度:
        標簽: 整理 文件 上傳
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产aⅴ成人精品无吗| 亚洲a级在线观看| 四虎影视久久久免费 | 亚洲一级免费视频| 国产成人A在线观看视频免费| 亚洲蜜芽在线精品一区| 亚洲一级毛片免费观看| 亚洲免费黄色网址| 免费人人潮人人爽一区二区| 国产成人免费全部网站| 四虎成人精品国产永久免费无码| 免费成人午夜视频| a在线视频免费观看在线视频三区| 国产性爱在线观看亚洲黄色一级片 | 亚洲国产成人久久精品动漫| 最新国产精品亚洲| 久久青草免费91线频观看站街| 免费理论片51人人看电影| 亚洲男人天堂av| 99在线精品视频观看免费| 亚洲区日韩精品中文字幕| 一本色道久久88综合亚洲精品高清| 亚洲国产精品xo在线观看| 成年女人色毛片免费看| 亚洲明星合成图综合区在线| 国产卡二卡三卡四卡免费网址| 久久久久亚洲AV成人无码网站| 99免费观看视频| 亚洲综合av一区二区三区| 亚洲精品国产精品乱码不卞| 日韩电影免费在线观看中文字幕| 亚洲国产人成在线观看| 国产片免费在线观看| 免费国产成人午夜在线观看| 亚洲国产成人超福利久久精品| 国产视频精品免费| 91成人免费福利网站在线| 国产成人精品日本亚洲11| 在线视频免费观看爽爽爽| 色多多免费视频观看区一区| 无码乱人伦一区二区亚洲|