關於FTP,先從怎么創建開始說起,很簡單,步驟就兩個
① 電腦-右鍵管理--本地用戶組--添加用戶名,密碼(用於FTP的用戶名、密碼)
② IIS 新建FTP站點,命名,指定端口號、FTP文件路徑
接下來就是進行訪問,網上有很多的FTP 幫助類,關於上傳、下載,重命名、獲取文件列表之類的方法。就不在贅述,這里主要講下怎么獲取圖片,直接顯示,而不必下載到本地。畢竟我這里的需求場景是實時刷新圖片,不可能每個客戶端都將攝像頭識別到的目標圖片下載到本地。其實當我們客戶端在加載FTP文件的時候,就已經在執行下載的操作了,只是先將文件加載(下載)到內存中。如果要保存到本地,就指定一個物理路徑,將加載到文件保存到該路徑上即可(這一點查看FTP幫助類即可發現)。
下面我們要在客戶端上顯示該圖片,首先最簡單的方法便是,拼接圖片路徑,給picturebox 控件賦值
//如果FTP站點指定路徑為 D:\Images\list,圖片的路徑為 D:\Images\list\A\20181024\xx.jpg //則 imgPath 為 A\20181024 //imgPath 圖片所在的FTP路徑(不包含圖片名) //imgName 圖片名 //連接服務器FTP var url = string.Format("ftp://{0}:{1}@{2}/{3}/{4}", "fan", "12306", "192.168.0.101:2048", Path, imgName); //直接賦值 pb_img.LoadAsync(url);
這種方法確實比較簡單,但是有一個缺點,就是在頻繁點擊圖片(加載大圖圖片)的時候,有時候程序會失去響應(並導致大圖圖片無法顯示)。所以如果是單單顯示圖片,沒有進一步的后續操作時,可以直接采用這種方法。此外還有一種方法,就是在內存中下載FTP圖片,然后將其用byte字節數組加載出來,再用MemoryStream內存流包裹,最后將該流轉換為圖片。賦值並顯示
//該路徑為 ftp完整路徑 帶用戶名,密碼,端口號,圖片路徑,圖片名,參考上一種方法中介紹
public static Image ReadImg(string ftpImgpath) { try { byte[] buffer = new WebClient().DownloadData(ftpImgpath); //byte[] 轉內存流 MemoryStream ms = new MemoryStream(buffer); Image img = Image.FromStream(ms, true); //流用完要及時關閉 ms.Close(); return img; } catch (Exception) { //轉換失敗,顯示默認圖 var path = System.Windows.Forms.Application.StartupPath; var ary = path.Substring(0, path.IndexOf("bin")); var imgpath = ary + "\\img\\notfount.jpg"; PictureBox pb = new PictureBox(); pb.ImageLocation = imgpath; return pb.Image; } }
這種方法比較穩妥,暴力點擊多次暫未發現啥異常。