使用PowerShell動態建立C#物件進行FTPS檔案上傳
早先在 PowerShell 以 Posh-SSH 模組開發了 SFTP 站台的檔案上傳腳本。需求又新增 FTPS 站台的檔案上傳支援。找了一下 PowerShell Gallery 比較多人使用的是 PSFTP 模組,測試了一下,發現大部分都是支援 FTP 與 SFTP,沒有直接支援 FTPS 的。沒有,那我們就直接在 PowerShell 裡刻一個吧。
C# 透過 FTPS 上傳檔案
我們找到一個官方的.NET FTP上傳檔案範例程式碼。我們查詢文件後得知,它是可以支援 FTPS 的(呼,放心了),進行一些組態與改寫讓它能支援 FTPS 協定:
public class FTPS
{
public static string Upload(string ftpaddr, string filepath)
{
string ftppath = string.Format("ftp://{0}", ftpaddr);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftppath);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;
// support FTPS
request.EnableSsl = true;
request.UseBinary = true;
request.KeepAlive = true;
request.UsePassive = true;
byte[] fileContents;
using (StreamReader sourceStream = new StreamReader(filepath))
{
fileContents = System.Text.Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
}
request.ContentLength = fileContents.Length;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(fileContents, 0, fileContents.Length);
}
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
string status = string.Format("Upload File Complete, status {0}", response.StatusDescription);
return status;
}
}
}
測試過程發現有幾個地方要注意:
ftppath
是要含檔案名稱的完整路徑。- 例如:
ftp://example.com/upload/testfile.zip
,一開始測試只有傳ftp://example.com/upload
結果回報說上傳有問題。
- 例如:
- 不要含太新的 C# 語法。
- 例如,一開始我很習慣用
$"Upload File Complete, status {response.StatusDescription}"
來進行字串輸出,結果就是得到一大串錯誤紅字。
- 例如,一開始我很習慣用
PowerShell 大腸包 .NET Framework 小腸
流程會指定一個目錄,它會例出此目錄下所有 *.zip 檔案(多檔案上傳),然後我們在 PowerShell 裡用 Add-Type
動態建立的 .NET 物件([NetTool.FTPS]::Upload
),之後就可以在 PowerShell 腳本中去呼叫來進行 FTPS 的上傳檔案作業。
人客呀!PowerShell + .NET Framework 這大腸包小腸會不會太香太強了點!
參考資料: https://blog.poychang.net/using-csharp-code-in-powershell-scripts/
因為我是寫 .NET 的,所以看 C# 程式碼會比較直接。還有一種直接 PowerShell 裡操作 .NET 物件的方式。
例如: https://gist.github.com/pbrumblay/6551936#file-ftpsupload-ps1 也可以學習參考看看。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。