關於FTP,先從怎麼建立開始提及,很簡單,步驟就兩個數組
① 電腦-右鍵管理--本地用戶組--添加用戶名,密碼(用於FTP的用戶名、密碼)服務器
② IIS 新建FTP站點,命名,指定端口號、FTP文件路徑url
接下來就是進行訪問,網上有不少的FTP 幫助類,關於上傳、下載,重命名、獲取文件列表之類的方法。就不在贅述,這裏主要講下怎麼獲取圖片,直接顯示,而沒必要下載到本地。畢竟我這裏的需求場景是實時刷新圖片,不可能每一個客戶端都將攝像頭識別到的目標圖片下載到本地。其實當咱們客戶端在加載FTP文件的時候,就已經在執行下載的操做了,只是先將文件加載(下載)到內存中。若是要保存到本地,就指定一個物理路徑,將加載到文件保存到該路徑上便可(這一點查看FTP幫助類便可發現)。spa
下面咱們要在客戶端上顯示該圖片,首先最簡單的方法即是,拼接圖片路徑,給picturebox 控件賦值code
//若是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內存流包裹,最後將該流轉換爲圖片。賦值並顯示orm
//該路徑爲 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; } }
這種方法比較穩妥,暴力點擊屢次暫未發現啥異常。blog