您的位置:首页 > 编程语言 > PHP开发

Ftp上传

2013-11-28 15:50 204 查看
public sealed class FtpClientService

    {

        private WaittingForm _waittingForm;

        public WaittingForm WaittingForm {

            get { return _waittingForm ?? (_waittingForm = new WaittingForm()); }

            set { _waittingForm = value; }

        }

        

        #region Internal Members

        private NetworkCredential certificate;

        #endregion

        /// <summary>

        /// 构造函数,提供初始化数据的功能,打开Ftp站点

        /// </summary>

        public FtpClientService()

        {

            string account = FTPAccount.Account;

            string passWord = FTPAccount.PassWord;

            certificate = new NetworkCredential(account, passWord);

        }

        /// <summary>

        /// 创建FTP请求

        /// </summary>

        /// <param name="uri"></param>

        /// <param name="method">Upload/Download</param>

        /// <returns></returns>

        private FtpWebRequest CreateFtpWebRequest(Uri uri, string method)

        {

            FtpWebRequest ftpClientRequest = (FtpWebRequest)WebRequest.Create(uri);

            //设置Ftp客户端请求的配置属性

            ftpClientRequest.Proxy = null;

            ftpClientRequest.Credentials = certificate;

            ftpClientRequest.KeepAlive = true;

            ftpClientRequest.UseBinary = true;

            ftpClientRequest.UsePassive = true;

            ftpClientRequest.Method = method;

            ftpClientRequest.UsePassive = false;//与ftp应用程序工具设置要一致

            //ftpClientRequest.Timeout = -1;

            return ftpClientRequest;

        }

        #region 支持断点续传

        public bool UploadFile(string sourceFile, Uri destinationPath, int offSet, string ftpMethod)

        {

            if (WaittingForm == null)

                return false;

            try

            {

                FileInfo file = new FileInfo(sourceFile);

                Uri uri = new Uri(destinationPath.AbsoluteUri + "/" + file.Name);

                FtpWebRequest request = CreateFtpWebRequest(uri, ftpMethod);

                

                request.ContentOffset = offSet;

                Stream requestStream = request.GetRequestStream();//需要获取文件的流

                FileStream fileStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);//创建存储文件的流

                long sourceLength = fileStream.Length;

                offSet = CopyDataToDestination(fileStream, requestStream, offSet);

                WebResponse response = request.GetResponse();

                response.Close();

                if (offSet != 0)

                {

                    //WaittingForm.Value = (int) (offSet*(int.MaxValue/sourceLength));

                    UploadFile(sourceFile, destinationPath, offSet, WebRequestMethods.Ftp.AppendFile);

                }

            }

            catch (Exception ex)

            {

                return false;

            }

            return true;

        }

        private int CopyDataToDestination(Stream sourceStream, Stream destinationStream, int offSet)

        {

            try

            {

                int sourceLength = (int)sourceStream.Length;

                int length = sourceLength - offSet;

                byte[] buffer = new byte[length + offSet];

                int bytesRead = sourceStream.Read(buffer, offSet, length);

                while (bytesRead != 0)

                {

                    destinationStream.Write(buffer, 0, bytesRead);

                    bytesRead = sourceStream.Read(buffer, 0, length);

                    length = length - bytesRead;

                    offSet = (bytesRead == 0) ? 0 : (sourceLength - length);//(length - bytesRead);                 

                }

            }

            catch (Exception ex)

            {

                string error = ex.ToString();

                return offSet;

            }

            finally

            {

                destinationStream.Close();

                sourceStream.Close();

            }

            return offSet;

        }

        #endregion

        //删除文件

        public bool DeleteFileName(string deletefile, Uri destinationPath)

        {

            try

            {

                FileInfo file = new FileInfo(deletefile);

                Uri uri = new Uri(destinationPath.AbsoluteUri + "/" + file.Name);

                FtpWebRequest reqFTP = CreateFtpWebRequest(uri, WebRequestMethods.Ftp.DeleteFile);

                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

                response.Close();

                return true;

            }

            catch (Exception ex)

            {

                return false;

            }

        }

        //创建目录

        public bool MakeDir(string dirName, Uri destinationPath)

        {

            try

            {

                FileInfo file = new FileInfo(dirName);

                Uri uri = new Uri(destinationPath.AbsoluteUri + "/" + file.Name);

                FtpWebRequest reqFTP = CreateFtpWebRequest(uri, WebRequestMethods.Ftp.MakeDirectory);

                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

                response.Close();

                return true;

            }

            catch (Exception ex)

            {

                return false;

            }

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# ftp