关闭

ftp上传下载类

标签: ftp 上传 下载 压缩
274人阅读 评论(0) 收藏 举报
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Drawing;
using System.IO.Compression;


namespace Ftp
{
    /// <summary>
    /// download and upload method
    /// </summary>
    public class FtpService
    {
        #region  Property


        private string ftpServer;
        /// <summary>
        /// ftp server host
        /// </summary>
        public string FtpServer
        {
            get { return ftpServer; }
            set { ftpServer = value; }
        }


        private string userName;
        /// <summary>
        /// authentication user
        /// </summary>
        public string UserName
        {
            get { return userName; }
            set
            {
                if (string.IsNullOrEmpty(value))
                {
                    throw new ArgumentNullException();
                }
                userName = value;
            }
        }


        private string passWord;
        /// <summary>
        /// authentication password
        /// </summary>
        public string PassWord
        {
            get { return passWord; }
            set
            {
                if (string.IsNullOrEmpty(value))
                {
                    throw new ArgumentNullException();
                }
                passWord = value;
            }
        }


        private int bufferSize = 1024;
        /// <summary>
        /// buffer size
        /// </summary>
        public int BufferSize
        {
            get
            {
                return bufferSize;
            }
            set { bufferSize = value; }
        }


        #endregion


        #region Constructors


        /// <summary>
        /// provider download and upload method
        /// </summary>
        public FtpService() { }


        /// <summary>
        ///  download and upload method
        /// </summary>
        /// <param name="ftpServer">server host example:ftp://127.1.1.0:80/*/ </param>
        /// <param name="userName">authentication userName</param>
        /// <param name="passWord">authentication passWord</param>
        public FtpService(string ftpServer, string userName, string passWord)
        {
            this.UserName = userName;
            this.PassWord = passWord;
            this.FtpServer = ftpServer;
        }


        #endregion


        #region Method


        /// <summary>
        ///  download file of single from ftp server
        /// </summary>
        /// <param name="localAddress">local address example:C://*/*.* </param>
        /// <param name="ftpAddress">ftp address  example:ftp://127.1.1.0:80/*/*.* </param>
        public Image Download(string localAddress, string ftpAddress)
        {
            Stream ftpStream = null;
            //FileStream outputStream = null;
            FtpWebResponse response = null;
            Image image = null;
            MemoryStream ms = null;
            try
            {
                //outputStream = new FileStream(localAddress, FileMode.Create);
                ms = new MemoryStream();


                FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpAddress));
                downRequest.Credentials = new NetworkCredential(userName, passWord);
                downRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                response = (FtpWebResponse)downRequest.GetResponse();
                ftpStream = response.GetResponseStream();


                int readCount;
                byte[] buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    ms.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                image = Image.FromStream(ms);
            }
            catch (UriFormatException ex)
            {
                throw ex;
            }
            catch (IOException ex)
            {
                throw ex;
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError)
                {
                    throw new WebException("当前用户没有修改权限!", ex);
                }
            }
            finally
            {
                if (ftpStream != null) ftpStream.Close();
                //if (outputStream != null) outputStream.Close();
                if (response != null) response.Close();
                if (ms != null) ms.Close();
            }
            return image;
        }


        /// <summary>
        ///  download file by filename
        /// </summary>
        /// <param name="localAddress">local address example:C://*/*.* </param>
        /// <param name="fileName">fileName</param>
        public Image DownloadByName(string localAddress, string fileName)
        {
            return Download(localAddress, ftpServer + fileName);
        }


        public byte[] GZipCompress(byte[] data)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                using (GZipStream stream = new GZipStream(ms, CompressionMode.Compress))
                {
                    stream.Write(data, 0, data.Length);
                }
                return ms.ToArray();
            }
        }


        /// <summary>
        /// upload file to ftp server
        /// </summary>
        /// <param name="localAddress">source file example:C://*/*.* </param>
        /// <param name="uploadUrl">ftp server address example:ftp://127.1.1.0:80/*/*.* </param>
        /// <returns></returns>
        public FtpStatusCode Upload(string localAddress, string uploadUrl)
        {
            Stream requestStream = null;
            FileStream fileStream = null;
            FtpWebResponse uploadResponse = null;
            try
            {
                FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(uploadUrl);
                uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;
                uploadRequest.Proxy = null;
                uploadRequest.UseBinary = true;
                uploadRequest.Credentials = new NetworkCredential(userName, passWord);
                requestStream = uploadRequest.GetRequestStream();
                fileStream = File.Open(localAddress, FileMode.Open);
                //sm = ConvertStream(fileStream);//


                byte[] buffer = new byte[bufferSize];
                int bytesRead;
                while (true)
                {
                    bytesRead = fileStream.Read(buffer, 0, buffer.Length);
                    if (bytesRead == 0) break;
                    requestStream.Write(buffer, 0, bytesRead);
                }
                requestStream.Close();


                uploadResponse = (FtpWebResponse)uploadRequest.GetResponse();
                return uploadResponse.StatusCode;
            }
            catch (UriFormatException ex)
            {
                throw ex;
            }
            catch (IOException ex)
            {
                throw ex;
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError)
                {
                    throw new Exception("当前用户没有修改权限!", ex);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (uploadResponse != null) uploadResponse.Close();
                if (fileStream != null) fileStream.Close();
                if (requestStream != null) requestStream.Close();
                //if (sm != null) sm.Close();
            }
            return FtpStatusCode.Undefined;
        }


        /// <summary>
        /// upload file to ftp server by fileName
        /// </summary>
        /// <param name="localAddress">source file example:C://*/*.* </param>
        /// <param name="fileName">filenName</param>
        /// <returns></returns>
        public FtpStatusCode UploadByName(string localAddress, string fileName)
        {
            return Upload(localAddress, ftpServer + fileName);
        }


        /// <summary>
        /// download all files from directory
        /// </summary>
        /// <param name="ftpServer">ftp server</param>
        /// <param name="ftpAddress">ftp address</param>
        /// <param name="localAddress">localddress</param>
        public void DownloadAll(string ftpServer, string ftpAddress, string localAddress)
        {
            string downloadDir = localAddress + ftpAddress;
            string ftpdir = ftpServer + ftpAddress;
            string[] fullname = GetDirectoryDetail(ftpServer, ftpAddress, WebRequestMethods.Ftp.ListDirectoryDetails);
            //判断是否为单个文件 
            if (fullname.Length <= 2)
            {
                if (fullname[fullname.Length - 1] == "")
                {
                    Download(downloadDir + "/" + ftpAddress, ftpServer + ftpAddress + "/" + ftpAddress);
                }
            }
            else
            {
                string[] onlyname = GetDirectoryDetail(ftpServer, ftpAddress, WebRequestMethods.Ftp.ListDirectory);
                if (!Directory.Exists(downloadDir))
                {
                    Directory.CreateDirectory(downloadDir);
                }
                foreach (string names in fullname)
                {
                    //判断是否具有文件夹标识<DIR>
                    if (names.Contains("<DIR>"))
                    {
                        string olname = names.Split(new string[] { "<DIR>" },
                        StringSplitOptions.None)[1].Trim();
                        DownloadAll(ftpdir, "//" + olname, downloadDir);
                    }
                    else
                    {
                        foreach (string onlynames in onlyname)
                        {
                            if (onlynames == "" || onlynames == " " || names == "")
                            {
                                break;
                            }
                            else
                            {
                                if (names.Contains(" " + onlynames))
                                {
                                    Download(downloadDir + "/" + onlynames, ftpServer + ftpAddress + "/" +
                                    onlynames);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }


        /// <summary>
        /// GetDirectoryDetail
        /// </summary>
        /// <param name="ftpAddress">ftp server</param>
        /// <param name="ftpAddress">folder or file name</param>
        /// <param name="type">command type</param>
        /// <returns></returns>
        private string[] GetDirectoryDetail(string ftpServer, string ftpAddress, string type)
        {
            WebResponse webresp = null;
            StreamReader ftpFileListReader = null;
            FtpWebRequest ftpRequest = null;
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpServer + ftpAddress));
                ftpRequest.Method = type;
                webresp = ftpRequest.GetResponse();
                ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default);
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
            StringBuilder str = new StringBuilder();
            string line = ftpFileListReader.ReadLine();
            while (line != null)
            {
                str.Append(line);
                str.Append("/n");
                line = ftpFileListReader.ReadLine();
            }
            string[] fen = str.ToString().Split(new string[] { "/n" }, StringSplitOptions.None);
            return fen;
        }


        #endregion
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:283次
    • 积分:4
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档
    阅读排行
    评论排行