zoukankan      html  css  js  c++  java
  • ftp上传文件和下载文件

        public class FtpService
        {
            #region Fields and attributes
            private readonly int BufLen = 2048;
            /// <summary>
            /// ftp服务器地址
            /// </summary>
            private readonly string FtpServer = Properties.Settings.Default.FtpServer;
            /// <summary>
            /// ftp用户名
            /// </summary>
            private readonly string FtpUser = Properties.Settings.Default.user;
            /// <summary>
            /// ftp密码
            /// </summary>
            private readonly string FtpPassword = Properties.Settings.Default.password;
            #endregion
    
            #region Events
            /// <summary>
            /// 文件上传结果
            /// </summary>
            /// <param>true-成功,false-失败</param>
            /// <param>信息</param>
            public event Action<bool, string> EventUploadResult = null;
            /// <summary>
            /// 文件上传进度
            /// </summary>
            /// <param>文件已上传大小</param>
            /// <param>文件总大小</param>
            /// <param>文件名称</param>
            public event Action<long, long, string> EventUploadFileProgress = null;
            /// <summary>
            /// 所有文件上传进度
            /// </summary>
            /// <param>文件已上传数</param>
            /// <param>文件总总数</param>
            public event Action<int, int> EventUploadBatchFilesProgress = null;
            /// <summary>
            /// 文件下载结果
            /// </summary>
            /// <param>true-成功,false-失败</param>
            /// <param>信息</param>
            public event Action<bool, string> EventDonwloadResult = null;
            /// <summary>
            /// 文件下载进度
            /// </summary>
            /// <param>文件已下载大小</param>
            /// <param>文件总大小</param>
            /// <param>文件名称</param>
            public event Action<long, long, string> EventDonwloadFileProgress = null;
            /// <summary>
            /// 所有文件下载进度
            /// </summary>
            /// <param>文件已下载数</param>
            /// <param>文件总总数</param>
            public event Action<int, int> EventDonwloadBatchFilesProgress = null;
            #endregion
    
            #region public methods
            /// <summary>
            /// 上传文件到FTPServer
            /// </summary>
            /// <param name="file"></param>
            public bool UploadFile(string localFilePath)
            {
                if (string.IsNullOrEmpty(localFilePath))
                    return false;
    
                bool ret = true;
                FtpWebRequest reqFtp = null;
                try
                {
                    FileInfo localFileInfo = new FileInfo(localFilePath);
                    string serverFilePath = $@"{FtpServer}{ localFileInfo.Name}";
    
                    //FtpWebRequest配置
                    reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
                    reqFtp.UseBinary = true;
                    reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); //设置通信凭据
                    reqFtp.KeepAlive = false;
                    reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
                    reqFtp.ContentLength = localFileInfo.Length;
    
                    //读本地文件数据并上传
                    using (FileStream fileStream = localFileInfo.OpenRead())
                    {
                        using (Stream stream = reqFtp.GetRequestStream())
                        {
                            long totalLen = 0;
                            int contentLen = 0;
                            byte[] buff = new byte[BufLen];
                            while ((contentLen = fileStream.Read(buff, 0, BufLen)) > 0)
                            {
                                stream.Write(buff, 0, contentLen);
                                totalLen += contentLen;
                                if (EventUploadFileProgress != null)
                                    EventUploadFileProgress(totalLen, localFileInfo.Length, localFileInfo.Name);
                            }
                        }
                    }
    
                    ret = true;
                    if (EventUploadResult != null)
                        EventUploadResult(ret, $@"{localFilePath} : 上传成功!");
                }
                catch (Exception ex)
                {
                    ret = false;
                    if (EventUploadResult != null)
                        EventUploadResult(ret, $@"{localFilePath} : 上传失败!Exception : {ex.ToString()}");
                }
                finally
                {
                    if (reqFtp != null)
                        reqFtp.Abort();
                }
    
                return ret;
            }
    
            /// <summary>
            /// 从FTPServer上下载文件
            /// </summary>
            public bool DownloadFile(string fileName, long length, string localDirectory)
            {
                if (string.IsNullOrEmpty(localDirectory) || string.IsNullOrEmpty(fileName))
                    return false;
    
                bool ret = true;
                FtpWebRequest reqFtp = null;
                FtpWebResponse respFtp = null;
                string localFilePath = $@"{localDirectory}{fileName}";
                string serverFilePath = $@"{FtpServer}{fileName}";
    
                try
                {
                    if (File.Exists(localFilePath))
                        File.Delete(localFilePath);
    
                    //建立ftp连接
                    reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
                    reqFtp.UseBinary = true;
                    reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
                    reqFtp.KeepAlive = false;
                    reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
    
                    //读服务器文件数据并写入本地文件
                    respFtp = reqFtp.GetResponse() as FtpWebResponse;
                    using (Stream stream = respFtp.GetResponseStream())
                    {
                        using (FileStream fileStream = new FileStream(localFilePath, FileMode.Create))
                        {
                            long totalLen = 0;
                            int contentLen = 0;
                            byte[] buff = new byte[BufLen];
                            while ((contentLen = stream.Read(buff, 0, BufLen)) > 0)
                            {
                                fileStream.Write(buff, 0, contentLen);
                                totalLen += contentLen;
                                if (EventDonwloadFileProgress != null && length > 0)
                                    EventDonwloadFileProgress(totalLen, length, fileName);
                            }
                        }
                    }
    
                    ret = true;
                    if (EventDonwloadResult != null)
                        EventDonwloadResult(ret, $@"{serverFilePath} : 下载成功!");
                }
                catch (Exception ex)
                {
                    ret = false;
                    if (EventDonwloadResult != null)
                        EventDonwloadResult(ret, $@"{serverFilePath} : 下载失败!Exception : {ex.ToString()}");
                }
                finally
                {
                    if (reqFtp != null)
                        reqFtp.Abort();
                    if (respFtp != null)
                        respFtp.Close();
                }
    
                return ret;
            }
    
            /// <summary>
            /// 批量上传文件
            /// </summary>
            /// <param name="localFilePaths"></param>
            public void UploadFiles(List<string> localFilePaths)
            {
                if (localFilePaths == null || localFilePaths.Count == 0)
                    return;
    
                int i = 1;
                foreach (var localFilePath in localFilePaths)
                {
                    UploadFile(localFilePath);
                    if (EventUploadBatchFilesProgress != null)
                        EventUploadBatchFilesProgress(i++, localFilePaths.Count);
                }
            }
    
            /// <summary>
            /// 批量下载文件
            /// </summary>
            /// <param name="fileNames"></param>
            /// <param name="localDirectory"></param>
            public void DownloadFiles(List<FileModel> files, string localDirectory)
            {
                if (files == null || files.Count == 0 || string.IsNullOrEmpty(localDirectory))
                    return;
    
                int i = 1;
                foreach (var file in files)
                {
                    DownloadFile(file.Name, file.Size, localDirectory);
                    if (EventDonwloadBatchFilesProgress != null)
                        EventDonwloadBatchFilesProgress(i++, files.Count);
                }
            }
    
            /// <summary>
            /// 异步上传文件到FTPServer
            /// </summary>
            /// <param name="file"></param>
            public async Task<bool> UploadFileAsync(string localFilePath)
            {
                if (string.IsNullOrEmpty(localFilePath))
                    return false;
    
                bool ret = true;
                FtpWebRequest reqFtp = null;
                try
                {
                    FileInfo localFileInfo = new FileInfo(localFilePath);
                    string serverFilePath = $@"{FtpServer}{ localFileInfo.Name}";
    
                    //FtpWebRequest配置
                    reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
                    reqFtp.UseBinary = true;
                    reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); //设置通信凭据
                    reqFtp.KeepAlive = false;
                    reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
                    reqFtp.ContentLength = localFileInfo.Length;
    
                    //读本地文件数据并上传
                    using (FileStream fileStream = localFileInfo.OpenRead())
                    {
                        using (Stream stream = await reqFtp.GetRequestStreamAsync())
                        {
                            long totalLen = 0;
                            int contentLen = 0;
                            byte[] buff = new byte[BufLen];
                            while ((contentLen = await fileStream.ReadAsync(buff, 0, BufLen)) > 0)
                            {
                                await stream.WriteAsync(buff, 0, contentLen);
                                totalLen += contentLen;
                                if (EventUploadFileProgress != null)
                                    EventUploadFileProgress(totalLen, localFileInfo.Length, localFileInfo.Name);
                            }
                        }
                    }
    
                    ret = true;
                    if (EventUploadResult != null)
                        EventUploadResult(ret, $@"{localFilePath} : 上传成功!");
                }
                catch (Exception ex)
                {
                    ret = false;
                    if (EventUploadResult != null)
                        EventUploadResult(ret, $@"{localFilePath} : 上传失败!Exception : {ex.ToString()}");
                }
                finally
                {
                    if (reqFtp != null)
                        reqFtp.Abort();
                }
    
                return ret;
            }
    
            /// <summary>
            /// 异步从FTPServer上下载文件
            /// </summary>
            public async Task<bool> DownloadFileAsync(string fileName, long length, string localDirectory)
            {
                if (string.IsNullOrEmpty(localDirectory) || string.IsNullOrEmpty(fileName))
                    return false;
    
                bool ret = true;
                FtpWebRequest reqFtp = null;
                FtpWebResponse respFtp = null;
                string localFilePath = $@"{localDirectory}{fileName}";
                string serverFilePath = $@"{FtpServer}{fileName}";
    
                try
                {
                    if (File.Exists(localFilePath))
                        File.Delete(localFilePath);
    
                    //建立ftp连接
                    reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
                    reqFtp.UseBinary = true;
                    reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
                    reqFtp.KeepAlive = false;
                    reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
    
                    //读服务器文件数据并写入本地文件
                    respFtp = await reqFtp.GetResponseAsync() as FtpWebResponse;
                    using (Stream stream = respFtp.GetResponseStream())
                    {
                        using (FileStream fileStream = new FileStream(localFilePath, FileMode.Create))
                        {
                            long totalLen = 0;
                            int contentLen = 0;
                            byte[] buff = new byte[BufLen];
                            while ((contentLen = await stream.ReadAsync(buff, 0, BufLen)) > 0)
                            {
                                await fileStream.WriteAsync(buff, 0, contentLen);
                                totalLen += contentLen;
                                if (EventDonwloadFileProgress != null && length > 0)
                                    EventDonwloadFileProgress(totalLen, length, fileName);
                            }
                        }
                    }
    
                    ret = true;
                    if (EventDonwloadResult != null)
                        EventDonwloadResult(ret, $@"{serverFilePath} : 下载成功!");
                }
                catch (Exception ex)
                {
                    ret = false;
                    if (EventDonwloadResult != null)
                        EventDonwloadResult(ret, $@"{serverFilePath} : 下载失败!Exception : {ex.ToString()}");
                }
                finally
                {
                    if (reqFtp != null)
                        reqFtp.Abort();
                    if (respFtp != null)
                        respFtp.Close();
                }
    
                return ret;
            }
    
            /// <summary>
            /// 异步批量上传文件
            /// </summary>
            /// <param name="localFilePaths"></param>
            public async void UploadFilesAsync(List<string> localFilePaths)
            {
                if (localFilePaths == null || localFilePaths.Count == 0)
                    return;
    
                int i = 1;
                foreach (var localFilePath in localFilePaths)
                {
                    await UploadFileAsync(localFilePath);
                    if (EventUploadBatchFilesProgress != null)
                        EventUploadBatchFilesProgress(i++, localFilePaths.Count);
                }
            }
    
            /// <summary>
            /// 异步批量下载文件
            /// </summary>
            /// <param name="fileNames"></param>
            /// <param name="localDirectory"></param>
            public async void DownloadFilesAsync(List<FileModel> files, string localDirectory)
            {
                if (files == null || files.Count == 0 || string.IsNullOrEmpty(localDirectory))
                    return;
    
                int i = 1;
                foreach (var file in files)
                {
                    await DownloadFileAsync(file.Name, file.Size, localDirectory);
                    if (EventDonwloadBatchFilesProgress != null)
                        EventDonwloadBatchFilesProgress(i++, files.Count);
                    System.Threading.Thread.Sleep(1000);
                }
            }
    
            /// <summary>
            /// 读取远程文件的内容
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            public string ReadFromFile(string serverFilePath)
            {
                if (string.IsNullOrEmpty(serverFilePath))
                    return "";
    
                string ret = "";
                FtpWebRequest reqFtp = null;
                FtpWebResponse respFtp = null;
    
                try
                {
                    //建立ftp连接
                    reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
                    reqFtp.UseBinary = true;
                    reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
                    reqFtp.KeepAlive = false;
                    reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
    
                    respFtp = reqFtp.GetResponse() as FtpWebResponse;
                    using (Stream stream = respFtp.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                        {
                            ret = reader.ReadToEnd();
                        }
                    }
                }
                catch (Exception ex)
                {
                    ret = "";
                    throw ex;
                }
                finally
                {
                    if (reqFtp != null)
                        reqFtp.Abort();
                    if (respFtp != null)
                        respFtp.Close();
                }
    
                return ret;
            }
    
            /// <summary>
            /// 读取远程文件的内容
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            public async Task<string> ReadFromFileAsync(string serverFilePath)
            {
                if (string.IsNullOrEmpty(serverFilePath))
                    return "";
    
                string ret = "";
                FtpWebRequest reqFtp = null;
                FtpWebResponse respFtp = null;
    
                try
                {
                    //建立ftp连接
                    reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
                    reqFtp.UseBinary = true;
                    reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
                    reqFtp.KeepAlive = false;
                    reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
    
                    respFtp = reqFtp.GetResponse() as FtpWebResponse;
                    using (Stream stream = respFtp.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                        {
                            ret = await reader.ReadToEndAsync();
                        }
                    }
                }
                catch (Exception ex)
                {
                    ret = "";
                    throw ex;
                }
                finally
                {
                    if (reqFtp != null)
                        reqFtp.Abort();
                    if (respFtp != null)
                        respFtp.Close();
                }
    
                return ret;
            }
    
            #endregion
        }
    

      

  • 相关阅读:
    <frame>、<iframe>、<embed>、<object> 和 <applet>
    xss攻击
    回流 和 重绘
    defer 和 async 的区别
    从输入URL到浏览页面的过程
    webkit vs v8
    缓存
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/yaosj/p/11125147.html
Copyright © 2011-2022 走看看