Powered By Blogger

關於我自己

我的相片
網站經營斷斷續續,現在以分享程式練習為主。 因為工作需要,不時會有練習程式的需要。 所以將自己練習的過程分享給大家。 如果有幫助到各位,那就太好了! 如果針對本人或網站內容有任何問題, 歡迎與我聯絡。

2016年7月30日 星期六

【VB.NET 語言】上報 練習 _ FTP Server 檔案上傳

小程式來到了第五集了!!!!不清楚頭尾請看(前情提要)
開始囉!!!
好的!居裡貓接著說說怎麼上傳檔案到 FTP 上面啦!
這次是真的 FTP 不是模擬的資料夾上傳啊!

這邊就需要到不一樣的東西來輔助我們了~
居裡貓還沒厲害到有辦法自己寫出個 FTP Server 這種東西啦~
所以用現成的就好了~那就是它~~:

FileZilla Server Interface (←點擊轉到官網下載頁面)

那至於如何架設屬於自己的 FTP Server ,這個就請各位自己去餵狗了~~

好的,大家都設定好 FTP Server 之後呢!
我們就會有三個新的東西~就是~

FTP Address
FTP Account
Account Password

大家可以回顧一下 前情提要 居裡貓在小程式的下面有三個 TextBox 可以放上面的三個資訊!
有了伺服器,有了網址、帳號和密碼,那我們就來看程式啦!
GO~~~~~~~~~~~~

-----------------------------------------------------------------------------------------------------------------------
  1. '這次程式依然跨足了好幾個地方~大家在看的時要注意~  
  2. '在 Write XML Button 裡面是要取得 FTP 上傳所需要的三個資訊~  
  3.   
  4.     'Button Contorl XML Write  
  5.     Private Sub Btn_WriteXML_Click(sender As Object, e As EventArgs) Handles Btn_WriteXML.Click  
  6.         'Check watch event was raising  
  7.         If Watcher.watcher.EnableRaisingEvents = False Then  
  8.             Watcher.watcher.EnableRaisingEvents = True  
  9.         End If  
  10.   
  11.         Copy_Delete_File.GetPath(TxB_Local.Text, TxB_Remote.Text, TxB_NAS.Text, TxB_FTP.Text, ChB_UploadFTP.Checked)  
  12.   
  13. '在這裡取得三個 FTP 所需資訊  
  14.   
  15.         FTPupload.Get_FTPinfo(TxB_FTPAddress.Text, TxB_FTPAccount.Text, Txb_FTPPassword.Text)  
  16.   
  17.         Dim wrXML As New XML  
  18.         wrXML.LocalPath = TxB_Local.Text  
  19.         wrXML.RemotePath = TxB_Remote.Text  
  20.         wrXML.NASPath = TxB_NAS.Text  
  21.         wrXML.FTPPath = TxB_FTP.Text  
  22.         wrXML.Data = "This is a Programming Practices " & Now.ToString  
  23.         wrXML.DateTime = Now.ToString  
  24.         If ChB_UploadFTP.Checked Then  
  25.             wrXML.CheckFTP = "Ture"  
  26.         Else  
  27.             wrXML.CheckFTP = "Flase"  
  28.         End If  
  29.   
  30.         Dim objectStreamWriter As New StreamWriter(TxB_Local.Text + ("\Program Practices " & Now.ToString("_yyyyMMddHHmmss") & ".xml"))  
  31.         Dim xmlserialize As New XmlSerializer(wrXML.GetType)  
  32.         xmlserialize.Serialize(objectStreamWriter, wrXML)  
  33.         objectStreamWriter.Dispose()  
  34.   
  35.         'Check backwork status  
  36.         'If Not back.IsBusy = True Then  
  37.         '    back.RunWorkerAsync()  
  38.         'End If  
  39.         Backwork.main()  
  40.   
  41.     End Sub  
  42.   
  43. '---分割線,上面取得資訊,下面是在需要的時間點啟動 FTP 上傳  
  44.   
  45. 'About Copy and Delete file  
  46. Public Class Copy_Delete_File  
  47.     'Parameter use for down below work  
  48.     Public Shared filename As String 'use get file name  
  49.     Public Shared sourcepath As String 'use get soure file path  
  50.     Public Shared copypath As String 'use get copy file path  
  51.     Public Shared uptonas As String 'use get upload to nas path  
  52.     Public Shared uptoftp As String 'use get upload to ftp path  
  53.     Public Shared checkbox As Boolean 'use get checkbox condition  
  54.   
  55.     'Get now file name  
  56.     Public Shared Sub GetFileName(Name As String)  
  57.         Console.WriteLine(Name & "  Get")  
  58.         filename = Name  
  59.   
  60.     End Sub  
  61.     'Get path to use copy file, delete file, upload file  
  62.     Public Shared Sub GetPath(source As String, copyformpath As String, upNASpath As String, upFTPpath As String, check As Boolean)  
  63.         Console.WriteLine(source & vbCr & copyformpath & vbCr & upNASpath & vbCr & upFTPpath)  
  64.         sourcepath = source  
  65.         copypath = copyformpath  
  66.         uptonas = upNASpath  
  67.         uptoftp = upFTPpath  
  68.         checkbox = check  
  69.     End Sub  
  70.     'Do copy file to remote folder, upload file to NAS folder and FTP folder then deleted local file  
  71.     Public Shared Sub copyfile()  
  72.         Try  
  73.             'Copy file to remote folder from local folder  
  74.             File.Copy(sourcepath + "\" + filename, copypath + "\" + filename, True)  
  75.   
  76.             'Control retry parameter  
  77.             Dim Retry As Boolean = True  
  78.             Dim retrytimes As Integer = 0  
  79.   
  80.             'Check upload to NAS or FTP  
  81.             If checkbox = False Then  
  82.                 While Retry  
  83.                     Try  
  84.                         'Upload to NAS, copy file from remote folder, upload done delete loacal file  
  85.                         File.Copy(copypath + "\" + filename, uptonas + "\" + filename, True)  
  86.                         System.Threading.Thread.Sleep(100)  
  87.                         Retry = False  
  88.                     Catch ex As Exception  
  89.                         'Upload to NAS Error, do retry upload file and count retry times  
  90.                         If retrytimes <= 10 Then  
  91.                             Retry = True  
  92.                             retrytimes += 1  
  93.                             'Console.WriteLine("Upload to NAS was Error, do retry upload, retry times : " & retrytimes)  
  94.                             ErrorList.AddLog(Now.ToString("yyyyMMddHHmmss _ ") + "Upload to NAS was Error, do retry upload, retry times : " & retrytimes)  
  95.                             System.Threading.Thread.Sleep(500)  
  96.                         Else  
  97.                             Retry = False  
  98.                             retrytimes = 0  
  99.                             'Console.WriteLine("Retry upload to NAS times was arrived")  
  100.                             'When retry arrived then add upload error filename into list and error log list  
  101.                             ErrorList.AddNas(filename)  
  102.                             ErrorList.AddLog(Now.ToString("yyyyMMddHHmmss _ ") + "Retry upload to NAS times was arrived")  
  103.                         End If  
  104.                     End Try  
  105.                 End While  
  106.                 File.Delete(sourcepath + "\" + filename)  
  107.             Else  
  108.                 While Retry  
  109.                     Try  
  110.                         'Upload to FTP, copy file from remote folder, upload done delete loacal file  
  111.                         File.Copy(copypath + "\" + filename, uptoftp + "\" + filename, True)  
  112.                         System.Threading.Thread.Sleep(100)  
  113.   
  114. 'FTP 上傳當然是要在複製檔案給 FTP 的時候啟動它阿~  
  115.   
  116.                         FTPupload.uploadtoftp()  
  117.                         System.Threading.Thread.Sleep(100)  
  118.                         Retry = False  
  119.                     Catch ex As Exception  
  120.                         'Upload to FTP Error, do retry upload file and count retry times  
  121.                         If retrytimes <= 10 Then  
  122.                             Retry = True  
  123.                             retrytimes += 1  
  124.                             'Console.WriteLine("Upload to FTP was Error, do retry upload, retry times : " & retrytimes)  
  125.                             ErrorList.AddLog(Now.ToString("yyyyMMddHHmmss _ ") + "Upload to FTP was Error, do retry upload, do retry upload, retry times : " & retrytimes)  
  126.                             System.Threading.Thread.Sleep(500)  
  127.                         Else  
  128.                             Retry = False  
  129.                             retrytimes = 0  
  130.                             'Console.WriteLine("Retry upload to FTP times was arrived")  
  131.                             'When retry arrived then add upload error filename into list and error log list  
  132.                             ErrorList.AddFtp(filename)  
  133.                             ErrorList.AddLog(Now.ToString("yyyyMMddHHmmss _ ") + "Retry upload to FTP times was arrived")  
  134.                         End If  
  135.                     End Try  
  136.                 End While  
  137.                 File.Delete(sourcepath + "\" + filename)  
  138.             End If  
  139.   
  140.         Catch ex As Exception  
  141.             ErrorList.AddLog(Now.ToString("yyyyMMddHHmmss _ ") + "Copy to reomte folder failure")  
  142.         End Try  
  143.     End Sub  
  144. End Class  
  145.   
  146. '下面開始才是 FTP 上傳的 Class  
  147.   
  148. 'About upload to FTP  
  149. Public Class FTPupload  
  150.     'Parameter usw for down below work  
  151.     Public Shared FTP_IP As String 'use get IP  
  152.     Public Shared FTP_Account As String 'use get account  
  153.     Public Shared FTP_Password As String 'use get password  
  154.   
  155. '這邊有個取得資訊用的程式段落  
  156.   
  157.     'Get FTP info, IP, account and password  
  158.     Public Shared Sub Get_FTPinfo(ByVal ip As StringByVal account As StringByVal password As String)  
  159.         FTP_IP = ip  
  160.         FTP_Account = account  
  161.         FTP_Password = password  
  162.     End Sub  
  163.   
  164. '這邊開始做 FTP 上傳時需要的工作  
  165.   
  166.     'Do upload work  
  167.     Public Shared Sub uploadtoftp()  
  168.         Dim ftpRequestStream As System.IO.Stream  
  169.         Dim statusDescription As String  
  170.         Dim retry As Boolean = True  
  171.         Dim retrytimes As Integer = 0  
  172.   
  173. '這邊一樣為了防止 FTP 上傳時失敗 ,所以加入重新上傳的機制  
  174.   
  175.         While retry  
  176.             'Create file  
  177.             Try  
  178.                 'Create FTP IP and upload file name  
  179.                 Dim ftpRequest As System.Net.FtpWebRequest = System.Net.FtpWebRequest.Create("ftp://" + FTP_IP + "//" + Copy_Delete_File.filename)  
  180.                 ftpRequest.Credentials = New System.Net.NetworkCredential(FTP_Account, FTP_Password) 'Set account and password  
  181.                 ftpRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile 'Set method is uploadfile mathod  
  182.                 System.Threading.Thread.Sleep(500)  
  183.                 ftpRequest.KeepAlive = True  
  184.   
  185.                 ftpRequestStream = ftpRequest.GetRequestStream  
  186.                 retry = False  
  187.             Catch ex As Exception  
  188.                 If retrytimes <= 10 Then  
  189.                     'If retry times less than 10 do retry and add retry times, error loglist  
  190.                     statusDescription = ex.Message  
  191.                     retry = True  
  192.                     retrytimes += 1  
  193.                     'Console.WriteLine("***Upload to FTP was Error, do retry upload, retry times : " & retrytimes)  
  194.                     ErrorList.AddLog(Now.ToString("yyyyMMddHHmmss _ ") + "***Upload to FTP was Error, do retry upload, retry times : " & retrytimes)  
  195.                     System.Threading.Thread.Sleep(500)  
  196.                 Else  
  197.   
  198.                     retry = False  
  199.                     retrytimes = 0  
  200.                     'Console.WriteLine("***Retry upload to FTP times was arrived")  
  201.                     'When retry arrived then add upload error filename into list and error log list  
  202.                     ErrorList.AddFtp(Copy_Delete_File.filename)  
  203.                     ErrorList.AddLog(Now.ToString("yyyyMMddHHmmss _ ") + "***Retry upload to FTP times was arrived")  
  204.                 End If  
  205.   
  206.             End Try  
  207.         End While  
  208.   
  209.         'Open copy file and then read file data  
  210.         Dim filestream As System.IO.FileStream  
  211.         Try  
  212.             filestream = System.IO.File.Open(Copy_Delete_File.copypath + "\" + Copy_Delete_File.filename, IO.FileMode.Open, IO.FileAccess.Read)  
  213.             'filestream = System.IO.File.Open(Copy_Delete_File.sourcepath + "\" + Copy_Delete_File.filename, IO.FileMode.Open, IO.FileAccess.Read)  
  214.         Catch ex As Exception  
  215.             statusDescription = ex.Message  
  216.         End Try  
  217.   
  218.         Dim buffer() As Byte = New Byte((filestream.Length) - 1) {}  
  219.         Dim byteRead As Integer  
  220.         'Do write data into FTP file  
  221.         While True  
  222.             byteRead = filestream.Read(buffer, 0, buffer.Length)  
  223.             If byteRead = 0 Then Exit While  
  224.             ftpRequestStream.Write(buffer, 0, byteRead)  
  225.         End While  
  226.   
  227.         filestream.Close()  
  228.         ftpRequestStream.Close()  
  229.   
  230.     End Sub


-------------------------------------------------------------------------------------------------------------------------

今天的分享就是這樣,
有了FTP Server 的資訊之後,在我們需要的時間點啟動 FTP 上傳工作,
工作的順序大概是這樣,有上傳的位置,有帳號跟密碼,
在上傳的位置建立起我們的檔案,
再把我們要上傳的資料寫入我們剛剛建立的檔案中~

這邊居裡貓提醒大家一個小地方,因為,居裡貓也碰到了這個問題,
可能是個笨問題,但是都碰到了就順便也提醒大家,
請大家看一下程式碼中的這一段~

 Dim ftpRequest As System.Net.FtpWebRequest = System.Net.FtpWebRequest.Create("ftp://" + FTP_IP + "//" + Copy_Delete_File.filename)

當時居裡貓沒有特別注意到這點,在寫這括弧中的內容就只有寫 FTP 的位置,沒有把檔名也一起寫進去,寫進去了卻沒注意到 FTP 網址需要的是 " // "反斜線啊!切忌切記~~

那就到這邊啦~其他的部分就等待下集~囉~~
謝謝大家的收看~
也感謝各位先進的教學文~


底下就是這個連續劇程式分享的分段分享內容

1. 上報 練習 _ 選擇資料夾
2. 上報 練習 _ 寫一個 .XML 資料
3. 上報 練習 _ 監控資料夾
4. 上報 練習 _ 複製檔案
5. 上報 練習 _ FTP Server 檔案上傳
6. 上報 練習 _ 上傳錯誤紀錄
7. 上報 練習 _ 使用 BackgroundWorker 再次上傳
8. 上報 練習 _ Log 紀錄
9. 上報 練習 _ 完整程式碼分享

沒有留言:

張貼留言