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

Posted

技术标签:

【中文标题】C#如何将大文件上传到ftp站点【英文标题】:C# How to upload large files to ftp site 【发布时间】:2013-04-10 03:55:09 【问题描述】:

我正在开发一个用于备份的 Windows 应用程序(文件和 sql 服务器数据库)。 现在我需要将这些文件(.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);

此代码仅上传大小

【问题讨论】:

你确定你的代码不工作的原因吗?当您的程序停止上传文件时究竟会发生什么? 【参考方案1】:

Stream 类有一个很好的方法CopyTo

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

使用此方法,您不必声明像new Byte[FileSize]; 这样的大型数组

【讨论】:

你是我生命中的天使!非常感谢! 我担心设置 FtpWebRequest.ContentLength 属性,但显然值is ignored by the FtpWebRequest class【参考方案2】:

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

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 可能 FTP 服务器端有一个设置,限制上传大于 310MB 的文件。您是否使用 IIS 设置 FTP 服务器?

以上是关于C#如何将大文件上传到ftp站点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GoogleDrive REST API 将大文件 (1 GB +) 上传到 Google Drive

如何将大文件上传到 Azure Blob 存储 (.NET Core)

无法将大文件上传到 Google 文档

如何在FTP上实现文件的上传和下载

Apache commons-net FTP - 将文件上传到安全 FTP IIS

将大文件上传到 sitecore 媒体库