C# 使用FtpWebRequest将大文件上载到FTP会导致;“基础连接已关闭”;
我试图上传一个相对较大的文件到FTP服务器(250-300mb)。我在控制台应用程序中执行此操作 当文件大小为几MB时,我的程序工作正常,但较大的文件会导致:C# 使用FtpWebRequest将大文件上载到FTP会导致;“基础连接已关闭”;,c#,.net,ftp,console-application,.net-4.5,C#,.net,Ftp,Console Application,.net 4.5,我试图上传一个相对较大的文件到FTP服务器(250-300mb)。我在控制台应用程序中执行此操作 当文件大小为几MB时,我的程序工作正常,但较大的文件会导致: System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. 我已尝试设置超时,但仍然出现错误 你知道如何修改我的代码,这样我就不会出错了吗 我的上传代码: using(var fs =
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive.
我已尝试设置超时,但仍然出现错误
你知道如何修改我的代码,这样我就不会出错了吗
我的上传代码:
using(var fs = File.OpenRead(zipFileName))
{
var ms = new MemoryStream();
ms.SetLength(fs.Length);
fs.Read(ms.GetBuffer(), 0, (int) fs.Length);
FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpUrl + "/" + zipFileName);
ftp.Credentials = new NetworkCredential(ftpUid, ftpPassword);
ftp.Timeout = 30000;
ftp.KeepAlive = true;
ftp.UseBinary = true;
ftp.Method = WebRequestMethods.Ftp.UploadFile;
byte[] buffer = new byte[ms.Length];
ms.Read(buffer, 0, buffer.Length);
ms.Close();
Stream ftpstream = ftp.GetRequestStream();
ftpstream.Write(buffer, 0, buffer.Length);
ftpstream.Close();
}
我用你的代码把一个1GB的文件上传到我的FTP服务器上。我也得到了System.Net.WebException。为了修复它,我将超时设置为-1(不超时)。之后,上传成功了
ftp.Timeout = -1; // No Timeout
另一方面,我不知道为什么要将文件读入MemoryStream,然后将其放入byte[]缓冲区。将文件流复制到FTP请求流会更快,并且使用更少的内存
using (var fs = File.OpenRead(zipFileName))
{
FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpUrl + "/" + zipFileName);
ftp.Credentials = new NetworkCredential(ftpUid, ftpPassword);
ftp.Timeout = -1;
ftp.KeepAlive = true;
ftp.UseBinary = true;
ftp.Method = WebRequestMethods.Ftp.UploadFile;
Stream ftpstream = ftp.GetRequestStream();
fs.CopyTo(ftpstream); // Copy the FileStream to the FTP RequestStream
ftpstream.Close();
// You should also check the response
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
Console.WriteLine("Code: {0}", response.StatusCode);
Console.WriteLine("Desc: {0}", response.StatusDescription);
}
我用你的代码把一个1GB的文件上传到我的FTP服务器上。我也得到了System.Net.WebException。为了修复它,我将超时设置为-1(不超时)。之后,上传成功了
ftp.Timeout = -1; // No Timeout
另一方面,我不知道为什么要将文件读入MemoryStream,然后将其放入byte[]缓冲区。将文件流复制到FTP请求流会更快,并且使用更少的内存
using (var fs = File.OpenRead(zipFileName))
{
FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpUrl + "/" + zipFileName);
ftp.Credentials = new NetworkCredential(ftpUid, ftpPassword);
ftp.Timeout = -1;
ftp.KeepAlive = true;
ftp.UseBinary = true;
ftp.Method = WebRequestMethods.Ftp.UploadFile;
Stream ftpstream = ftp.GetRequestStream();
fs.CopyTo(ftpstream); // Copy the FileStream to the FTP RequestStream
ftpstream.Close();
// You should also check the response
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
Console.WriteLine("Code: {0}", response.StatusCode);
Console.WriteLine("Desc: {0}", response.StatusDescription);
}
尝试使用FTP程序上载同一文件。可能是服务器的问题。并增加或禁用超时。尝试使用FTP程序上载同一文件。可能是服务器的问题。并增加超时或禁用超时。我使用了相同的代码进行传输,但应用程序抛出“无法将数据写入传输连接:远程主机强制关闭了现有连接”。上载数据大小为:-310MB。我使用了相同的代码进行传输,但应用程序抛出“无法将数据写入传输连接:远程主机已强制关闭现有连接。”上载数据大小为:-310MB