如何在 C# 中使用 FTP 上传文件

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 C# 中使用 FTP 上传文件相关的知识,希望对你有一定的参考价值。

咨询区

  • webvision

我尝试用 C# 上传一个文件到 FTP-Server 上,文件已显示上传成功但显示 0Byte,我的代码大概是这样的。

private void button2_Click(object sender, EventArgs e)
{
    var dirPath = @"C:/Documents and Settings/sander.GD/Bureaublad/test/";

    ftp ftpClient = new ftp("ftp://example.com/", "username", "password");

    string[] files = Directory.GetFiles(dirPath,"*.*");

    var uploadPath = "/httpdocs/album";

    foreach (string file in files)
    {
        ftpClient.createDirectory("/test");

        ftpClient.upload(uploadPath + "/" + Path.GetFileName(file), file);
    }

    if (string.IsNullOrEmpty(txtnaam.Text))
    {
        MessageBox.Show("Gelieve uw naam in te geven !");
    }
}

回答区

  • cdev

很简单,在 .NET5 中可以这么实现。

async Task<FtpStatusCode> FtpFileUploadAsync(string ftpUrl, string userName, string password, string filePath)
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential(userName, password);

    using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    using (Stream requestStream = request.GetRequestStream())
    {
        await fileStream.CopyToAsync(requestStream);
    }

    using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync())
    {
        return response.StatusCode;
    }
}

在 .NET Framework 中可以这么实现。

public void UploadFtpFile(string folderName, string fileName)
{
    FtpWebRequest request;

    string folderName; 
    string fileName;
    string absoluteFileName = Path.GetFileName(fileName);
    
    request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/{2}", "127.0.0.1", folderName, absoluteFileName))) as FtpWebRequest;
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = 1;
    request.UsePassive = 1;
    request.KeepAlive = 1;
    request.Credentials =  new NetworkCredential(user, pass);
    request.ConnectionGroupName = "group"; 

    using (FileStream fs = File.OpenRead(fileName))
    {
        byte[] buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        fs.Close();
        Stream requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Flush();
        requestStream.Close();
    }
}

然后像下面这样使用。

UploadFtpFile("testFolder", "E:\\\\filesToUpload\\\\test.img");
  • Saeb Amini

对于文件上传,为啥要对底层的 WebRequest 进行封装造轮子呢?你完全可以使用 WebClient 实现 FTP 的文件上传,参考如下代码:

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile);
}

点评区

居然用 WebClient 就能轻松的实现文件上传,Saeb Amini 大佬🐂👃。

以上是关于如何在 C# 中使用 FTP 上传文件的主要内容,如果未能解决你的问题,请参考以下文章

java Ftp上传创建多层文件的代码片段

c#使用FluentFtp实现一行代码实现ftp上传下载等

c#使用FluentFtp实现一行代码实现ftp上传下载等

C# 使用 FTP 上传整个目录

如何将文件上传到 c# Azure Function 生成的 FTP/webdav? [复制]

C# 将FTP文件转移到另一个FTP服务器上如何实现