关于FTP,先从怎么创建开始说起,很简单,步骤就两个
① 电脑-右键管理--本地用户组--添加用户名,密码(用于FTP的用户名、密码)
② IIS 新建FTP站点,命名,指定端口号、FTP文件路径
接下来就是进行访问,网上有很多的FTP 帮助类,关于上传、下载,重命名、获取文件列表之类的方法。就不在赘述,这里主要讲下怎么获取图片,直接显示,而不必下载到本地。毕竟我这里的需求场景是实时刷新图片,不可能每个客户端都将摄像头识别到的目标图片下载到本地。其实当我们客户端在加载FTP文件的时候,就已经在执行下载的操作了,只是先将文件加载(下载)到内存中。如果要保存到本地,就指定一个物理路径,将加载到文件保存到该路径上即可(这一点查看FTP帮助类即可发现)。
下面我们要在客户端上显示该图片,首先最简单的方法便是,拼接图片路径,给picturebox 控件赋值
//如果FTP站点指定路径为 D:Imageslist,图片的路径为 D:ImageslistA20181024xx.jpg //则 imgPath 为 A20181024 //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; } }
这种方法比较稳妥,暴力点击多次暂未发现啥异常。