『QQ:1353814576』

FtpWebRequest 实现向FTP服务器上传文件


FtpWebRequest 实现向FTP服务器上传文件

最近一个虚拟打印的需求 就是监听文件然后把文件上传到Ftp服务器上 自己c#实现封装了个上传类 用着还不错 这里分享下

   public class FtpUpload
    {
        string _host { get; set; }
        string _port { get; set; }
        string _user { get; set; }
        string _password { get; set; }
        string _relative { get; set; }
        string _usepassive { get; set; }

        private FtpUpload(string host, string port, string user, string password,string relative,string usepassive)
        {
            _host = host;
            _port = port;
            _user = user;
            _password = password;
            _relative = relative;
            _usepassive = usepassive;
        }

        public static FtpUpload Create()
        {
		 //ftp服务器IP
            string UploadServerHost = ConfigurationManager.AppSettings.Get("UploadServerHost");
			//端口
            string UploadServerPort = ConfigurationManager.AppSettings.Get("UploadServerPort");
			//相对目录
            string RelativeDirectory = ConfigurationManager.AppSettings.Get("RelativeDirectory");
			//用户名
            string UserName = ConfigurationManager.AppSettings.Get("UserName");
			//密码
            string UserPassword = ConfigurationManager.AppSettings.Get("UserPassword");
			//被动模式
            string UsePassive=ConfigurationManager.AppSettings.Get("UsePassive");
            return new FtpUpload(UploadServerHost, UploadServerPort, UserName, UserPassword, RelativeDirectory, UsePassive);
        }

        public bool Connected()
        {
            byte[] buf = new byte[1024];
            TcpClient b = new TcpClient();
            int portInt = 0;
            int.TryParse(_port, out portInt);
            b.Connect(_host, portInt); //IP及端口
            return b.Connected;
        }

        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="LoctionPath"></param>
        /// <returns></returns>
        public bool Upload(string LoctionPath)
        {
            try
            {
                if (!_relative.StartsWith("/"))
                {
                    _relative = $"/{_relative}";
                }

                _relative.Replace("//", "/");
                string RelativePath = $"ftp://{_host}:{_port}/{_relative}/{Guid.NewGuid()}.pdf";

                FtpWebRequest FtpClient = (FtpWebRequest)FtpWebRequest.Create(new Uri(RelativePath));
                FtpClient.Credentials = new NetworkCredential(_user, _password);
                FtpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
                FtpClient.UseBinary = true;
                bool UsePassive = false;
                bool.TryParse(_usepassive, out UsePassive);
                FtpClient.UsePassive = UsePassive;
                FtpClient.KeepAlive = false;

                using (FileStream fs = new FileStream(LoctionPath,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite))
                {
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    fs.Close();
                    fs.Dispose();
                    using (Stream ftpstream = FtpClient.GetRequestStream())
                    {
                        ftpstream.Write(buffer, 0, buffer.Length);
                        ftpstream.Close();
                        ftpstream.Dispose();
                    }
                }

                return true;
            }
            catch (Exception ex)
            {
                Log4Net.Error($"【Ftp文件上传失败】 {LoctionPath}", ex);
            }
            return false;
        }

    }

调用例子

FtpUpload ftp=FtpUpload.Create();
ftp.Upload("文件地址")