听听音乐 發表於 2025-10-27 08:27:48

.net实现FTP传输文件的详细教程

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1、系统方法手动实现</a></li><li><a href="#_label1">2、使用开源的Nuget包FluentFTP</a></li></ul></div><p>两种实现方式:</p>
<p>(1)系统方法手动实现</p>
<div class="jb51code"><pre class="brush:csharp;">   优点:不依靠其他任何依赖,可以实现自己需要的各种自定需求的操作
   缺点:手动实现起来麻烦,操作繁琐,自己实现需要考虑各种异常情况等等
</pre></div>
<p>(2)Nuget包FluentFTP</p>
<div class="jb51code"><pre class="brush:csharp;">   优点:实现起来简单,使用起来方便,功能丰富
   缺点:必须要添加项目依赖Nuget包FluentFTP
</pre></div>
<p class="maodian"><a name="_label0"></a></p><h2>1、系统方法手动实现</h2>
<div class="jb51code"><pre class="brush:csharp;">   /// &lt;summary&gt;
   /// ftp传输
   /// &lt;/summary&gt;
   /// &lt;param name="ftpSavePath"&gt;ftp保存地址 例:ftp://172.18.18.53/172.18.18.101/&lt;/param&gt;
   /// &lt;param name="ftpFileName"&gt;ftp保存文件名称 例:htrs_1.mp4&lt;/param&gt;
   /// &lt;param name="localFilePath"&gt;本地文件路径 例:C:\\files\\htrs_1.mp4&lt;/param&gt;
   /// &lt;param name="userName"&gt;ftp用户名&lt;/param&gt;
   /// &lt;param name="password"&gt;ftp密码&lt;/param&gt;
   public static bool FTPUploadFile(string ftpSavePath, string ftpFileName, string localFilePath, string userName, string password)
   {
       if (!File.Exists(localFilePath))
       {
         return false;
       }

       //校验路径是否存在
       if (!TryCreateDirectory(ftpSavePath, userName, password))
         return false;

       try
       {
         FileInfo fileInfo = new FileInfo(localFilePath);

         // 创建ftp请求
         FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpSavePath + ftpFileName);
         request.Method = WebRequestMethods.Ftp.UploadFile;
         request.Credentials = new NetworkCredential(userName, password);
         request.UseBinary = true;
         request.KeepAlive = false; // 上传完成后关闭连接
         request.Timeout = 300000; // 5分钟超时

         // ✅ 使用流式传输,避免内存溢出
         using (FileStream fileStream = new FileStream(localFilePath, FileMode.Open, FileAccess.Read))
         using (Stream requestStream = request.GetRequestStream())
         {
               byte[] buffer = new byte; // 64KB缓冲区
               int bytesRead;
               long totalBytes = 0;
               DateTime lastLogTime = DateTime.Now;

               while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) &gt; 0)
               {
                   requestStream.Write(buffer, 0, bytesRead);
                   totalBytes += bytesRead;

                   // 每10秒记录一次上传进度(可选)
                   if ((DateTime.Now - lastLogTime).TotalSeconds &gt;= 10)
                   {
                     double progress = (double)totalBytes / fileInfo.Length * 100;
                     lastLogTime = DateTime.Now;
                   }
               }
         }
       }
       catch (Exception ex)
       {
         return false;
       }

       return true;
   }
   /// &lt;summary&gt;
   /// 校验ftp目录是否存在
   /// &lt;/summary&gt;
   /// &lt;param name="directoryUri"&gt;&lt;/param&gt;
   /// &lt;param name="username"&gt;&lt;/param&gt;
   /// &lt;param name="password"&gt;&lt;/param&gt;
   /// &lt;returns&gt;&lt;/returns&gt;
   public static bool TryCreateDirectory(string directoryUri, string username, string password)
   {
       try
       {
         // 创建 FTP 请求以检查目录
         FtpWebRequest request = (FtpWebRequest)WebRequest.Create(directoryUri);
         request.Method = WebRequestMethods.Ftp.ListDirectory;
         request.Credentials = new NetworkCredential(username, password);

         // 尝试获取目录列表
         using FtpWebResponse response = (FtpWebResponse)request.GetResponse();
       }
       catch (WebException ex)
       {
         // 如果目录不存在,则会抛出异常
         if (ex.Response is FtpWebResponse response &amp;&amp; response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
         {
               // 创建目录
               FtpWebRequest createDirRequest = (FtpWebRequest)WebRequest.Create(directoryUri);
               createDirRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
               createDirRequest.Credentials = new NetworkCredential(username, password);

               using var createResponse = (FtpWebResponse)createDirRequest.GetResponse();
         }
         else
         {
               //其他异常
               return false;
         }
       }
       catch (Exception ex)
       {
         return false;
       }

       return true;
   }
   
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>2、使用开源的Nuget包FluentFTP</h2>
<div class="jb51code"><pre class="brush:csharp;">    public async Task Test()
    {
      string ip = "172.18.18.200";
      int port = 21;
      string userName = "ftpuser";
      string pwd = "ftpuser";

      FluentFTP.AsyncFtpClient ftp = new FluentFTP.AsyncFtpClient(ip, userName, pwd, port)
      {
            Config = new FluentFTP.FtpConfig
            {
                ConnectTimeout = 5000,//连接超时,单位为毫秒
                DataConnectionConnectTimeout = 5000, //数据连接超时,单位为毫秒
                DataConnectionReadTimeout = 5000, //数据读取超时,单位为毫秒
                ReadTimeout = 5000, //读取超时,单位为毫秒
                RetryAttempts = 3 //重试次数
            }
      };

      //开始连接FTP服务器
      await ftp.Connect();

      // 检查目录是否存在,如果不存在则创建
      if (! await ftp.DirectoryExists("wtTest"))
      {
            await ftp.CreateDirectory("wtTest");
      }

      // 上传文件
      await ftp.UploadFile(@"C:\Users\Htkw\Desktop\111\1.jpg", "wtTest/test.jpg");

      // 下载文件
      await ftp.DownloadFile(@"C:\Users\Htkw\Desktop\111\downloaded_test.jpg", "wtTest/test.jpg");



      await ftp.Disconnect(); //关闭连接
      await ftp.DisposeAsync(); //释放资源
    }
</pre></div>
頁: [1]
查看完整版本: .net实现FTP传输文件的详细教程