首页 > 解决方案 > C# FTP 上传卡在特定文件上

问题描述

我的 C# 程序有问题。我有一个很大的 zip 存档(大约 4Gb),它被分成小块,实际上每块都是 100 Mb。所以,当我的程序开始上传文件时,它工作得很好,直到第 14 件开始上传。我的程序仅上传了该片段的约 90 Mb,然后我收到错误“远程服务器返回错误:(451) 处理中的本地错误”。我的 C# 程序检测文件是否未成功上传并尝试上传它,所以我得到了一个永无止境的循环。

private static void SendToFtp(AppConfig cfg, string zipName)
{
    Console.WriteLine("Starting FTP upload");
    NetworkCredential creds = new NetworkCredential(cfg.FtpUserName, cfg.FtpPassword);
   try
   {
    StringBuilder sb = new StringBuilder();
    DirectoryInfo di = new DirectoryInfo(cfg.ZipFolder);
    byte[] buffer = null;
    foreach (var file in di.EnumerateFiles())
    {
        using (Stream st = File.OpenRead(file.FullName))
        using (BinaryReader br = new BinaryReader(st))
        {

            bool success = false;
            while (!success)
            {
                br.BaseStream.Seek(0, SeekOrigin.Begin);
                buffer = br.ReadBytes((int)file.Length);

                sb.Append($"ftp://{cfg.FtpHost}/{file.Name}");
                request = (FtpWebRequest)WebRequest.Create(sb.ToString());
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.UseBinary = false;
                request.UsePassive = false;
                request.KeepAlive = false;
                request.ServicePoint.ConnectionLimit = 1000;
                request.Credentials = new NetworkCredential(cfg.FtpUserName, cfg.FtpPassword);

                using (Stream requestStream = request.GetRequestStream())
                {
                    try
                    {
                        requestStream.Write(buffer, 0, buffer.Length);
                        requestStream.Flush();
                        requestStream.Close();

                        var resp = (FtpWebResponse)request.GetResponse();
                        success = !success;
                        Console.WriteLine($"======================{file.Name}=======================");
                        Console.WriteLine($"Message:{resp.StatusDescription}");
                        Console.WriteLine($" Status code: {resp.StatusCode}");
                        Console.WriteLine($"========================================================");
                    }
                    catch (Exception ex)
                    {
                        request.Abort();
                        Console.WriteLine($"MSG: {ex.Message}");

                    }
                }
                sb.Clear();
            }
        }

    }
    Console.WriteLine("FTP upload finished");
    }
    catch (Exception ex)
    {
         Console.WriteLine($"{ex.Message}; {ex.Source}");
    }

}

所以,有人可以帮助我或指出我错在哪里。谢谢!

标签: c#.netftp

解决方案


推荐阅读