C# 如何上传大文件到 FTP 站点

4

我正在开发一个用于备份(文件和SQL Server数据库)的Windows应用程序。 现在我需要将这些文件(.rar文件)上传到我的FTP站点。 为了上传,我使用以下代码。

代码

string file = "D:\\RP-3160-driver.zip";
//opening the file for read.
string uploadFileName = "", uploadUrl = "";
uploadFileName = new FileInfo(file).Name;
uploadUrl = "ftp://ftp.Sitename.com/tempFiles/";
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
try
{
   long FileSize = new FileInfo(file).Length; // File size of file being uploaded.

   Byte[] buffer = new Byte[FileSize];
   fs.Read(buffer, 0, buffer.Length);
   fs.Close();
   fs = null;

   string ftpUrl = string.Format("{0}/{1}", uploadUrl, uploadFileName);
   FtpWebRequest requestObj = FtpWebRequest.Create(ftpUrl) as FtpWebRequest;
   requestObj.Method = WebRequestMethods.Ftp.UploadFile;
   requestObj.Credentials = new NetworkCredential("usernam", "password");
   Stream requestStream = requestObj.GetRequestStream();
   requestStream.Write(buffer, 0, buffer.Length);
   requestStream.Flush();
   requestStream.Close();
   requestObj = null;
   MessageBox.Show("File upload/transfer Successed.", "Successed", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
   if (fs != null)
   {
      fs.Close();
   }
   MessageBox.Show("File upload/transfer Failed.\r\nError Message:\r\n" + ex.Message, "Successed", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

这段代码仅上传文件大小小于5 Mb的文件。但我需要上传500Mb至1Gb的大文件。请问有人可以帮助我吗?


你确定了代码不起作用的原因吗?当你的程序停止上传文件时,具体发生了什么? - Security Hound
2个回答

9

对于较大的文件,您可以选择在读取文件流时将其写入输出流。

FileStream fs = null;
Stream rs = null;

try 
{
    string file = "D:\\RP-3160-driver.zip";
    string uploadFileName = new FileInfo(file).Name;
    string uploadUrl = "ftp://ftp.Sitename.com/tempFiles/";
    fs = new FileStream(file, FileMode.Open, FileAccess.Read);

    string ftpUrl = string.Format("{0}/{1}", uploadUrl, uploadFileName);
    FtpWebRequest requestObj = FtpWebRequest.Create(ftpUrl) as FtpWebRequest;
    requestObj.Method = WebRequestMethods.Ftp.UploadFile;
    requestObj.Credentials = new NetworkCredential("usernam", "password");
    rs = requestObj.GetRequestStream();

    byte[] buffer = new byte[8092];
    int read = 0;
    while ((read = fs.Read(buffer, 0, buffer.Length)) != 0)
    {
       rs.Write(buffer, 0, read);
    }
    rs.Flush();
}
catch (Exception exception) 
{

    MessageBox.Show("File upload/transfer Failed.\r\nError Message:\r\n" + exception.Message, "Succeeded", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally 
{
    if (fs != null)
    {
        fs.Close();
        fs.Dispose();
    }

    if (rs != null)
    {
        rs.Close();
        rs.Dispose();
    }
}

我已经使用相同的代码进行传输,但应用程序抛出“无法将数据写入传输连接:远程主机强制关闭了现有的连接。”上传数据大小为:-310MB。 - Abhay.Patil
@Abhay.Patil 可能是FTP服务器端的某个设置限制了上传大于310MB的文件。您是否使用IIS来设置FTP服务器? - Nithin B

4

Stream类有一个很好的方法CopyTo

您不需要从/向流中读写。只需使用fs.CopyTo(requestStream);

通过这种方法,您无需声明像new Byte[FileSize];这样的大数组。


你是我生命中的天使!真的非常感谢你! - khaosdoctor
我曾经担心设置FtpWebRequest.ContentLength属性,但显然FtpWebRequest类会忽略该值。 - mcdon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接