无恨星晨 通过本文主要向大家介绍了client helper,ftpclient类,ftpclient,filezilla ftp client,ftpclient api等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
文档说明
本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行
1.基本介绍
由于最近的项目是客户端的程序,需要将客户端的图片文件【切图】-【打包】-【ftp上传】,现在就差最后一步了,慢慢的把这些小功能实现了,合并到一起就是一个大功能了,所以一个业务需要拆分的很小很小才可以看清楚,这个项目实际需要用到哪些知识点,下面介绍一下ftp上传的命令
ftp命令的参考链接:http://www.weikejianghu.com/article/12199.htm
ftp适合小文件上传
对带宽要求要求较高
服务器安全性也要考虑到
命令需要熟悉,不然比较难
2.实际项目
文件上传
文件下载
删除文件
创建文件夹
文件夹重命名
删除文件夹
改变目录
获取文件夹中文件列表
等等
2.1 图片上传和下载
写了几个方法,一般用的最多的就是Put,具体的可以下载复制源码下来进行实战一下。
2.2 目录创建和删除
这个方法今天刚好用上了,折腾了一会,才搞定的。
3.调用代码参考
由于这个帮助类不是静态的,所以需要实例化
string userName = "xxx"; string password = "xxx"; var ftp = new FTPClientHelper("xxx", ".", userName, password, 1021);</div>
下面还是调用常用的方法,就可以了,因为账号、密码、服务器的IP地址都被我用“xxx”代替了,所以大家自己改下,还有ftp默认端口号是:1021,如果有变动还是需要自己改下的。
4.FTPClientHelper下载
//------------------------------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2015 , ZTO , Ltd . //------------------------------------------------------------------------------------- using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace ZTO.PicTest.Utilities { /// <summary> /// FTP操作帮助类 /// /// 修改纪录 /// /// 2016-4-4 版本:1.0 YangHengLian 创建主键,注意命名空间的排序,测试非常好。 /// /// 版本:1.0 /// /// <author> /// <name>YangHengLian</name> /// <date>2016-4-4</date> /// </author> /// </summary> public class FTPClientHelper { public static object Obj = new object(); #region 构造函数 /// <summary> /// 缺省构造函数 /// </summary> public FTPClientHelper() { RemoteHost = ""; _strRemotePath = ""; _strRemoteUser = ""; _strRemotePass = ""; _strRemotePort = 21; _bConnected = false; } /// <summary> /// 构造函数 /// </summary> public FTPClientHelper(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort) { // Ip地址 RemoteHost = remoteHost; // 这个很重要,表示连接路径,如果是.表示根目录 _strRemotePath = remotePath; // 登录账号 _strRemoteUser = remoteUser; // 登录密码 _strRemotePass = remotePass; // ftp端口号 _strRemotePort = remotePort; Connect(); } #endregion #region 字段 private int _strRemotePort; private Boolean _bConnected; private string _strRemotePass; private string _strRemoteUser; private string _strRemotePath; /// <summary> /// 服务器返回的应答信息(包含应答码) /// </summary> private string _strMsg; /// <summary> /// 服务器返回的应答信息(包含应答码) /// </summary> private string _strReply; /// <summary> /// 服务器返回的应答码 /// </summary> private int _iReplyCode; /// <summary> /// 进行控制连接的socket /// </summary> private Socket _socketControl; /// <summary> /// 传输模式 /// </summary> private TransferType _trType; /// <summary> /// 接收和发送数据的缓冲区 /// </summary> private const int BlockSize = 512; /// <summary> /// 编码方式 /// </summary> readonly Encoding _ascii = Encoding.ASCII; /// <summary> /// 字节数组 /// </summary> readonly Byte[] _buffer = new Byte[BlockSize]; #endregion #region 属性 /// <summary> /// FTP服务器IP地址 /// </summary> public string RemoteHost { get; set; } /// <summary> /// FTP服务器端口 /// </summary> public int RemotePort { get { return _strRemotePort; } set { _strRemotePort = value; } } /// <summary> /// 当前服务器目录 /// </summary> public string RemotePath { get { return _strRemotePath; } set { _strRemotePath = value; } } /// <summary> /// 登录用户账号 /// </summary> public string RemoteUser { set { _strRemoteUser = value; } } /// <summary> /// 用户登录密码 /// </summary> public string RemotePass { set { _strRemotePass = value; } } /// <summary> /// 是否登录 /// </summary> public bool Connected { get { return _bConnected; } } #endregion #region 链接 /// <summary> /// 建立连接 /// </summary> public void Connect() { lock (Obj) { _socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var ep = new IPEndPoint(IPAddress.Parse(RemoteHost), _strRemotePort); try { _socketControl.Connect(ep); } catch (Exception) { throw new IOException("不能连接ftp服务器"); } } ReadReply(); if (_iReplyCode != 220) { DisConnect(); throw new IOException(_strReply.Substring(4)); } SendCommand("USER " + _strRemoteUser); if (!(_iReplyCode == 331 || _iReplyCode == 230)) { CloseSocketConnect(); throw new IOException(_strReply.Substring(4)); } if (_iReplyCode != 230) { SendCommand("PASS " + _strRemotePass); if (!(_iReplyCode == 230 || _iReplyCode == 202)) { CloseSocketConnect(); throw new IOException(_strReply.Substring(4)); } } _bConnected = true; ChDir(_strRemotePath); } /// <summary> /// 关闭连接 /// </summary> public void DisConnect() { if (_socketControl != null) { SendCommand("QUIT"); } CloseSocketConnect(); } #endregion #region 传输模式 /// <summary> /// 传输模式:二进制类型、ASCII类型 /// </summary> public enum TransferType { Binary, ASCII }; /// <summary> /// 设置传输模式 /// </summary> /// <param name="ttType">传输模式</param> public void SetTransferType(TransferType ttType) { SendCommand(ttType == TransferType.Binary ? "TYPE I" : "TYPE A"); if (_iReplyCode != 200) { throw new IOException(_strReply.Substring(4)); } _trType = ttType; }