ftp上傳占內存
1. 上傳的大文件
基於WEB的文件上傳可以使用ftp和HTTP兩種協議,用FTP的話雖然傳輸穩定,但安全性是個嚴重的問題,而且FTP伺服器讀用戶庫獲取許可權,這樣對於用戶使用來說還是不太方便。 剩下只有HTTP。在HTTP中有3種方式,PUT、WEBDAV、RFC1867,前2種方法不適合大文件上傳,基本上我們使用的web上傳都是基於RFC1867標準的HTML中基於表單的文件上傳。
RFC1867:
1.HTML表單
現有的HTML規范為INPUT元素的TYPE屬性定義了八種可能的值,分別是:CHECKBOX, HIDDEN,MAGE,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。 從另一方面來說,分解為多部分的機制工作得很好,能夠非常簡單的在客戶發送端和伺服器接受端加以實現,而且能像其他一些綜合處理二進制數據的方式一樣高效率地工作。
RFC上傳
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.UpLoadMole和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佔用如此之低.....。
上傳問題
我們在上傳大文件時都遇到過這樣或那樣的問題。設置很大的maxRequestLength值並不能完全解決問題,因為會block直到把整個文件載入內存後,再加以處理。實際上,如果文件很大的話,我們經常會見到Internet Explorer顯示 The page cannot be displayed - Cannot find server or DNS Error,好像是怎麼也catch不了這個錯。為什麼?因為這是個client side錯誤,server side端的Application_Error是處理不到的。
解決的方法是利用隱含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法從IIS為建立的pipe里分塊讀取數據。Chris Hynes為我們提供了這樣的一個方案(用HttpMole),該方案除了允許你上傳大文件外,還能實時顯示上傳進度。
Lion.Web.UpLoadMole和AspnetUpload 兩個.NET組件都是利用的這個方案。
方案原理:
利用HttpHandler實現了類似於ISAPI Extention的功能,處理請求(Request)的信息和發送響應(Response)。
方案要點:
1. httpHandler or HttpMole
a.分塊讀取和寫入數據
b.實時跟蹤上傳進度更新meta信息
2. 利用隱含的HttpWorkerRequest用它的GetPreloadedEntityBody 和 ReadEntityBody方法處理文件流
3. 自定義Multipart MIME 解析器。
自動截獲MIME分割符。
將文件分塊寫如臨時文件。
實時更新Appliaction 狀態(ReceivingData, Error, Complete) 。
2. 路由器的TFTP伺服器是什麼意思
TFTP伺服器是指使用TFTP協議的伺服器。
TFTP是TCP/IP協議族中的一個用來在客戶機與伺服器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。埠號為69。
TFTP作為一個傳輸文件的簡單協議,是基於UDP協議而實現的,但是也不能確定有些TFTP協議是基於其它傳輸協議完成的。此協議設計的時候是進行小文件傳輸的。
因此它不具備通常的FTP的許多功能,它只能從文件伺服器上獲得或寫入文件,不能列出目錄,不進行認證,它傳輸8位數據。
(2)ftp上傳占內存擴展閱讀:
TFTP伺服器的有點:
1、TFTP可用於UDP環境;比如當需要將程序或者文件同時向許多機器下載時就往往需要使用到TFTP協議。
2、TFTP代碼所佔的內存較小,這對於較小的計算機或者某些特殊用途的設備來說是很重要的,這些設備不需要硬碟,只需要固化了TFTP、UDP和IP的小容量只讀存儲器即可。當電源接通後,設備執行只讀存儲器中的代碼,在網路上廣播一個TFTP請求。
3、網路上的TFTP伺服器就發送響應,其中包括可執行二進製程序。設備收到此文件後將其放入內存,然後開始運行程序。這種方式增加了靈活性,也減少了開銷。
參考資料來源:網路-TFTP
3. FTP、TFTP、NFS的區別是什麼
FTP_TFTP_NFS三種文件傳輸協議的區別
文件傳送協議FTP(File Transfer Protocol)是Internet上使用比較廣泛的文件傳送協議。
FTP提供互動式的訪問,允許客戶指明文件的類型與格式,並允許文件具有存取許可權。
FTP屏蔽了各種計算機系統的細節,因此適用於在異構網路中任意計算機之間傳送文件。它的基本應用就是將文件從一台計算機復制到另一台計算機中。
它要存取一個文件,就必須先獲得一個本地文件的副本,如果修改文件,也只能對文件的副本進行修改,然後再將修改後的文件副本傳回到原節點。
您只要記住幾個關鍵詞:互動式、存取許可權和副本。
單文件傳送協議TFTP(Trivial File Transfer Protocol)是一個小而易於實現的文件傳送協議。TFTP是基於UDP數據報,需要有自己的差錯改正措施。TFTP只支持文件傳輸,不支持交互,沒有龐大的命令集。也沒有目錄列表功能,以及不能對用戶進行身份鑒別。但它的代碼所佔內存較小,不需要硬碟就可以固化TFTP代碼,很適合較小的計算機和特殊用途的設備。
您會發現TFTP和FTP一個主要的區別就是它沒有互動式,且不進行身份驗證。
NFS最初應用於UNIX操作系統下,它允許應用進程打開一個遠地文件,並能夠在該文件中某一個特定位置上開始讀寫數據。