遇到一個需求,某個上傳 CSV 的 WebAPI 想改成讓使用者選擇檔案上傳,由於是暫時性 Workaround,不想為此多寫上傳檔案網頁。 呼叫 WebAPI 上傳檔案對程式人員是小事一椿,知道檔名路俓下個指令用 curl 或 PowerShell 就搞定,但對一般電腦使用者來說多少有點難度。 雖然我很想衝去業務單位,手把手教經辦美眉學會開 DOS 視窗敲指令,但提出這種解決方案有點丟臉,在 End-User 眼中,點兩下選檔案按確定上傳才是操作軟體的王道。

所以呢,我們可以開 Visual Studio 寫個 WinForm 或 WPF 小程式,或是... 寫幾行 PowerShell Script。

對,這次我就練習了用 PowerShell 完成「瀏覽選取檔案並上傳顯示結果」這件事。

其實不難,PowerShell 可建立及操作 .NET 物件,因此我們可以借助 System.Windows.Forms 的 OpenFileDialog 選取檔案,透過 MessageBox.Show() 顯示結果。 參考:How to create an open file/folder dialog box with PowerShell 至於上傳 CSV 檔,野外求生系列 - 無工具 WebApi 徒手測試介紹過的 Invoke-WebRequest 有個 -InFile 參數,提供檔案路徑就能 將檔案內容當成 HTTP Request Body 傳送。

先寫一個超簡單 ASPX 接收上傳內容數配合測試:

<%@Page Language="C#"%>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
	if (Request.HttpMethod == "POST") {
		using (var sr = new System.IO.StreamReader(Request.InputStream)) 
		{
			var lines = sr.ReadToEnd().Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
			Response.Write("上傳共" + lines.Length + "筆");
		}
	}
	else Response.Write("請 POST CSV");	
}
</script>

SelFileUpload.ps1 範例如下:

Add-Type -AssemblyName System.Windows.Forms
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
    InitialDirectory = '.\' #[Environment]::GetFolderPath('Desktop') 
    Filter = 'CSV (*.csv)|*.csv'
}
$diagRes = $FileBrowser.ShowDialog()
if ($diagRes -eq "OK") {
	$file = $FileBrowser.FileName
	$res = (Invoke-WebRequest -Method POST -Uri http://localhost/Test/UploadCsv.aspx -InFile $file -UseDefaultCredentials).Content
	[System.Windows.Forms.MessageBox]::Show($res)
}

使用時要在檔案按右鍵選取「用 PowerShell 執行」:

啟動後出現 Windows PowerShell 藍色視窗,前景彈出檔案選取對話框:

上傳結果以 MessageBox 顯示:

基本上這已經很接近 GUI 操作風格,但一開始從右鍵選單啟動不夠順手,簡單解法是建個捷徑,之後點兩下就可執行:

建立 .ps1 捷徑的詳細做法可參考 PowerShell Scripting - Run a Script from Shortcut, 目標參數還可再加上 -WindowStyle Hidden,執行過程不會看到藍色或黑色 Windows PowerShell 命令列視窗,體驗又再提升一些。範例:powershell.exe -File D:\PSOpenFile\SelFileUpload.ps1 -ExecutionPolicy Bypass -WindowStyle Hidden

練習完畢。

Example of using PowerShell and System.Windows.Forms control to implement browse and upload GUI.


Comments

# by Soon

Hi 黑大, ...使用時要在檔案按右鍵選取「用 PowerShell 執行」... 這行字以下的三張圖片 都是前一篇文【Visual Studio 簽入 Git 遺漏檔案】的圖了

# by Soon

重整後又正常了,可能我 眼花 ...

# by Jeffrey

to Soon, 謝。你沒眼花,我發文後也發現了。疑似兩篇文章的本機 Markdown 檔錯亂,幸好 Dropbox 可回遡版本,己修正好。

# by 匿名

右鍵執行PS檔可以考慮從屬性直接修改預設執行程式,變更為powershell後也能直接點兩下喔!

# by Jeffrey

to 匿名,我有考慮過,但不推這種做法。理由是有可能意外執行到具破壞性或有害的腳本。

Post a comment