![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 LuLu ![]()
![]() |
關於FTP上傳,基本功能是要系統在後台隱密的進行不用使用者操作也就是自動上傳檔案到伺服器。 但是碰到上傳200M以上的檔案時,系統運作的時間差不多要30分鐘以上,為此我特地利用檔案切割的方式切成了50M左右,時間仍超過10分鐘, 切成一個5M左右又太多被伺服器封鎖連接,上傳時間連測都不用測了。 透過FileZilla上傳200M以上的檔案也不用幾分鐘很快,但是不論是用 My.Computer.Network.UploadFile()或 System.Net.FtpWebRequest 時間都太長了,使用者等5分鐘就已經很極限,而且這兩個方法好像會讓我常常因為匿名登入而造成連線封鎖的問題 請問各位高手這個問題要怎麼解決? |
別忘捐VP感謝幫助你的人 | 新手會員瞧一瞧 |
1樓 |
【基本功能是要系統在後台隱密的進行不用使用者操作也就是自動上傳檔案到伺服器。】
。你是在Server背景運作嗎? (多人連線時是同個FTP連線同時出現嗎?) 。FTP的Server是自己架的還是網路上的? 。寫單機程式來測試上傳200M的檔案,使用 My.Computer.Network.UploadFile()或 System.Net.FtpWebRequest也一樣久嗎?
本篇文章回覆於2018-02-12 14:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
2樓 |
微軟上傳已經封裝一個指令,上傳過久,跟這指令沒關,跟server的頻寬以及同時多少人使用有關
像我的server以前是雙向512Kbps 上傳200M時間 =200*1024*1024/(512*1024/8) =53.33分 後來改為 4M/1M ,上傳是1Mbps 上傳200M時間 =200*1024*1024/(1024*1024/8) =26.67分鐘 現在改為光世代 16M/3M 上傳是3Mbps =200*1024*1024/(3*1024*1024/8) =8.89分鐘 您要先了解server頻寬是多少,若以我現在的8.89分鐘來算,是一人獨用才8.89分鐘,若同時有4個人上傳200M資料 頻寬平均使用,還是會變成35.56分 =200*1024*1024*4人/(3*1024*1024/8) =35.56分鐘
本篇文章回覆於2018-02-12 22:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
3樓
作者回應
LuLu ![]() |
回覆小羊窒息大大,我是單機連虛擬伺服器架設的ftp,就是那麼久
回覆香帥大大,頻寬我無法決定,因為那是客戶那邊的網路,用我這邊的單機程式很久,但是用FileZilla那邊也可以跑很快所以我很不解 求救,這問題困擾我很久,急需幫忙,謝謝各位好心的大大
本篇文章回覆於2018-02-12 23:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
4樓 |
我試著用 3種方式把195MB的【jdk-8u121-windows-x64.exe】上傳到自己的FTP...
My.Computer.Network.UploadFile() 耗時 580秒左右 執行時期, 記憶體固定佔用4MB左右... (我沒有去找UploadFile的原始碼, 但要是沒意外的話大概是固定上傳4096 Byte)... (然後應該每次在上傳的過程中都有做額外的檢查, 以致於拖慢速度) ======================== System.Net.FtpWebRequest 耗時 82秒左右... 執行時期, 記憶體佔用200多MB(因為我是直接寫一行 File.ReadAllBytes("要上傳的195MB的檔案"), 所以在記憶體中直接被吃掉195MB 程式碼是參考這一篇的 https://docs.microsoft.com/zh-tw/dotnet/framework/network-programming/how-to-upload-files-with-ftp#example (不過那是傳文字檔的,必須要把 byte [] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 直接換掉才行) ======================== FileZilla 耗時 81秒左右 (程式畫面顯示2.4 MiB/秒) ========================= 個人結論:用System.Net.FtpWebRequest直接上傳的速度跟FileZilla 是一樣的, 剩下的應該是你的code怎麼寫的了...
本篇文章回覆於2018-02-13 11:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
5樓
作者回應
LuLu ![]() |
我最早就是用這樣,經歷過記憶體不足的問題,後來是時間,我還把一個250MB多的去切成50MB的再傳,但傳第一個50MB就要6分鐘以上...
下面是我大概的程式碼 但我用FileZilla完全不會這樣,怎麼會跟小羊窒息大大的差那麼多,我直接傳250MB的甚至會就到被伺服器斷開...
本篇文章回覆於2018-02-13 17:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
6樓 |
你的寫法有點特殊....
第7行 While Datas > 0 一直到 第35行 End While 照理說應該只是要用來讀取單一個檔案("D:/test/" + fi.Name)而已, (這種非一次讀取完畢的寫法, 就是要減少記憶體負擔, 而你定義的size就是50M,以250MB的檔案來說,就是跑5∼6次) 一般來說,讀取完一部份就上傳一部份,是常見的方式 然而你卻選擇讀取完50M之後,先另存成一個檔案【fi.Name + i.ToString()】 接著又重新把另存好的檔案,再讀取一次 Dim bFile13() As Byte = System.IO.File.ReadAllBytes("D:/test/" + filename) 然後才開始上傳。。。(或許你是為了在上傳時順便做檔案切割,到這裡也還好,只是程式執行比較佔用電腦資源,這裡都還跟網路無關) (最離奇的地方是........27~29行,你選擇個別的1個Byte1個Byte的上傳!!!?? 50MB的檔案你要分成 1024 x 1024 x 50 次來上傳???) 只用26行的指令來上傳有問題嗎?? =======================================
本篇文章回覆於2018-02-14 14:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
7樓
作者回應
LuLu ![]() |
所以大大,我可能上面說的不夠清楚,你介紹我的方法一開始我就是這樣試的,應該說最基本的就是那樣,但我不知道為何我去傳就是那麼久,用250MB實測傳久到會1個1個Byte傳都會被伺服器斷開,更不用說整個傳→斷開,所以我乾脆做7~35行檔案切割...
然後27~29的原因是也是同樣,因為整個傳時間久到會被伺服器斷開,我也不知道為什麼會那麼久,上網看了人家的解決方法說要這樣保持連線...但總歸上傳時間就是久 所以我才上來問為什麼會這樣我該怎麼解決,畢竟我也是碰到各種情況才會一步一步改成這樣的...
本篇文章回覆於2018-02-15 20:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
8樓 |
你可以自己另外架一個FTP (用本機連線試試), 交叉比對一下,
看速度是否依然那麼慢, 以及是否會斷線 多一些測試環境比較容易找出程式碼的問題所在, 不過幫助不大就是了 試著加上try catch,看看斷線時的錯誤訊息, 再試著去找找解決方案吧 (也許你得去找找斷線重連的方式) =============== 像這篇就是不同FTP伺服器所發生的問題... http://blog.darkthread.net/post-2011-10-07-ftpwebrequest-underlying-conn-exception.aspx
本篇文章回覆於2018-02-20 09:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
9樓
作者回應
LuLu ![]() |
嗯...還有沒有別的更明確的解決方法? 比如改進程式碼或換另一種寫法上傳...有聽說過FtpWebRequest是很爛的方法,是真的嗎?
都沒有人有碰過上傳很慢這樣的問題嗎...
本篇文章回覆於2018-02-23 00:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
10樓 |
【上傳很慢】應該是所有寫程式或架站的人都遇過的問題,
然而這個在早期都是頻寬問題(多數都是使用者端的網路非常龜速), 也就是說, 著重點一定都在: 背景執行時慢慢的上傳,斷線後續傳,而不是很快很快的把檔案傳完 (天曉得使用者端是否有開BT,或迅雷這類的軟體)
本篇文章回覆於2018-02-23 09:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
11樓 |
如果微軟.Net內建的不符需求,
=========================== 要嘛找第三方套件試試,例如:https://www.rebex.net/download/default.aspx#Ftp (要錢的,可以下載回來測試看看是否能解決,能解決再請公司花錢買) =========================== 要嘛用別的程式來負責上傳,再由VB.NET直接執行就好 像是windows內建的Wscript(例如 VBScript, JScript) http://naterice.com/ftp-upload-and-ftp-download-with-vbscript/ (具體的方式就是在VB.Net裡面透過shell來呼叫,早期要做word轉pdf時,網路上有流傳這種方式, 不必受限於單一程式平台,也不用特地買第三方套件) (甚至是如果FileZilla允許你直接用command line來執行單一個上傳作業的話,也可以用這招直接解決, 大前提是使用者端必須要安裝FileZilla...) ===========================
本篇文章回覆於2018-02-23 10:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
12樓 |
使用dos指令的方式(windows內建的ftp),給你參考 圖片網址:https://imgur.com/a/Klhwp (我前一篇貼的Wscript的方式其實就是呼叫dos指令,只是Wscript連同文字檔一併建立好,以便快速呼叫) ======================== 我用上面的方式,上傳195MB的檔案,186秒 同一台電腦改用 FileZilla,104秒 送出文章之前再用dos指令再試一次:196秒 ======================== 至少用一下dos指令(最單純的程式)來試試你的網路吧...
本篇文章回覆於2018-02-23 14:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |