使用 C # 将文件上传到 FTP

我尝试用 C # 将一个文件上传到一个 FTP 服务器。

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 !");
}
}
328487 次浏览

下面这些对我有用:

public virtual void Send(string fileName, byte[] file)
{
ByteArrayToFile(fileName, file);


var request = (FtpWebRequest) WebRequest.Create(new Uri(ServerUrl + fileName));


request.Method = WebRequestMethods.Ftp.UploadFile;
request.UsePassive = false;
request.Credentials = new NetworkCredential(UserName, Password);
request.ContentLength = file.Length;


var requestStream = request.GetRequestStream();
requestStream.Write(file, 0, file.Length);
requestStream.Close();


var response = (FtpWebResponse) request.GetResponse();


if (response != null)
response.Close();
}

无法读取代码中的 file 参数,因为它只是文件名。

使用以下方法:

byte[] bytes = File.ReadAllBytes(dir + file);

获取文件,以便将其传递给 Send方法。

. NET 5 < a href = “ https://Learn.microsoft.com/en-us/dotnet/api/system.NET.ftpwebrerequest? view = NET-5.0”rel = “ nofollow noReferrer”> Guide

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 框架

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");

用这个做你的前额

你只需要创建一次文件夹

创建文件夹

request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/", "127.0.0.1", "testFolder"))) as FtpWebRequest;
request.Method = WebRequestMethods.Ftp.MakeDirectory;
FtpWebResponse ftpResponse = (FtpWebResponse)request.GetResponse();

在第一个例子中,必须将其更改为:

requestStream.Flush();
requestStream.Close();

第一次同花顺,然后关门。

public static void UploadFileToFtp(string url, string filePath, string username, string password)
{
var fileName = Path.GetFileName(filePath);
var request = (FtpWebRequest)WebRequest.Create(url + fileName);


request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = false;


using (var fileStream = File.OpenRead(filePath))
{
using (var requestStream = request.GetRequestStream())
{
fileStream.CopyTo(requestStream);
requestStream.Close();
}
}


var response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Upload done: {0}", response.StatusDescription);
response.Close();
}

现有的答案是有效的,但是为什么要重新发明轮子,并且在 WebClient已经灵活地实现 FTP 上传的情况下,还要麻烦地使用较低级别的 WebRequest类型呢:

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

这对我有用,这种方法将 SFTP 文件到您的网络中的一个位置。 它使用了 SSH.NET. 2013.4.7库,可以免费下载。

    //Secure FTP
public void SecureFTPUploadFile(string destinationHost,int port,string username,string password,string source,string destination)


{
ConnectionInfo ConnNfo = new ConnectionInfo(destinationHost, port, username, new PasswordAuthenticationMethod(username, password));


var temp = destination.Split('/');
string destinationFileName = temp[temp.Count() - 1];
string parentDirectory = destination.Remove(destination.Length - (destinationFileName.Length + 1), destinationFileName.Length + 1);




using (var sshclient = new SshClient(ConnNfo))
{
sshclient.Connect();
using (var cmd = sshclient.CreateCommand("mkdir -p " + parentDirectory + " && chmod +rw " + parentDirectory))
{
cmd.Execute();
}
sshclient.Disconnect();
}




using (var sftp = new SftpClient(ConnNfo))
{
sftp.Connect();
sftp.ChangeDirectory(parentDirectory);
using (var uplfileStream = System.IO.File.OpenRead(source))
{
sftp.UploadFile(uplfileStream, destinationFileName, true);
}
sftp.Disconnect();
}
}

我观察到

  1. FtpwebRequest 丢失。
  2. 由于目标是 FTP,因此需要 NetworkCredential。

我已经准备了一个这样的方法,您可以用参数 TargetDestinationPath 替换变量 ftpurl 的值。我在 winform 应用程序上测试了这个方法:

private void UploadProfileImage(string TargetFileName, string TargetDestinationPath, string FiletoUpload)
{
//Get the Image Destination path
string imageName = TargetFileName; //you can comment this
string imgPath = TargetDestinationPath;


string ftpurl = "ftp://downloads.abc.com/downloads.abc.com/MobileApps/SystemImages/ProfileImages/" + imgPath;
string ftpusername = krayknot_DAL.clsGlobal.FTPUsername;
string ftppassword = krayknot_DAL.clsGlobal.FTPPassword;
string fileurl = FiletoUpload;


FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl);
ftpClient.Credentials = new System.Net.NetworkCredential(ftpusername, ftppassword);
ftpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
ftpClient.UseBinary = true;
ftpClient.KeepAlive = true;
System.IO.FileInfo fi = new System.IO.FileInfo(fileurl);
ftpClient.ContentLength = fi.Length;
byte[] buffer = new byte[4097];
int bytes = 0;
int total_bytes = (int)fi.Length;
System.IO.FileStream fs = fi.OpenRead();
System.IO.Stream rs = ftpClient.GetRequestStream();
while (total_bytes > 0)
{
bytes = fs.Read(buffer, 0, buffer.Length);
rs.Write(buffer, 0, bytes);
total_bytes = total_bytes - bytes;
}
//fs.Flush();
fs.Close();
rs.Close();
FtpWebResponse uploadResponse = (FtpWebResponse)ftpClient.GetResponse();
string value = uploadResponse.StatusDescription;
uploadResponse.Close();
}

如果有任何问题,请告诉我,或者这里还有一个链接可以帮助你:

Https://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx

最简单的方法

使用.NET 框架将文件上传到 FTP 服务器的最简单方法是使用 WebClient.UploadFile:

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
var url = "ftp://ftp.example.com/remote/path/file.zip";
client.UploadFile(url, @"C:\local\path\file.zip");

高级选择

如果您需要一个更大的控制,WebClient不提供(如 TLS/SSL 加密,ascii/文本传输模式,主动模式,传输恢复,进度监控等) ,使用 FtpWebRequest。简单的方法是使用 Stream.CopyToFileStream复制到 FTP 流:

var url = "ftp://ftp.example.com/remote/path/file.zip";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;


using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
fileStream.CopyTo(ftpStream);
}

进度监测

如果你需要监控上传过程,你必须自己把内容分块复制:

var url = "ftp://ftp.example.com/remote/path/file.zip";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;


using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
byte[] buffer = new byte[10240];
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
ftpStream.Write(buffer, 0, read);
Console.WriteLine("Uploaded {0} bytes", fileStream.Position);
}
}

有关 GUI 进展(WinForms ProgressBar) ,请参阅 C # 示例:
如何显示用 FtpWebRequest 上传的进度条


上传文件夹

如果要从文件夹上载所有文件,请参见
使用 WebClient 将文件目录上传到 FTP 服务器。

有关递归上载,请参见
用 C # 递归上传到 FTP 服务器

出版日期: 2018年6月26日

Https://learn.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp

using System;
using System.IO;
using System.Net;
using System.Text;


namespace Examples.System.Net
{
public class WebRequestGetExample
{
public static void Main ()
{
// Get the object used to communicate with the server.
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm");
request.Method = WebRequestMethods.Ftp.UploadFile;


// This example assumes the FTP site uses anonymous logon.
request.Credentials = new NetworkCredential("anonymous",
"janeDoe@contoso.com");


// Copy the contents of the file to the request stream.
byte[] fileContents;
using (StreamReader sourceStream = new StreamReader("testfile.txt"))
{
fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
}


request.ContentLength = fileContents.Length;


using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(fileContents, 0, fileContents.Length);
}


using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"Upload File Complete, status
{response.StatusDescription}");
}
}
}
}

我找到的最好的方法是 FluentFtp 你可以在这里找到回购协议: Https://github.com/robinrodricks/fluentftp 这里有一个快速启动的例子: Https://github.com/robinrodricks/fluentftp/wiki/quick-start-example.

实际上这里有一些人推荐的 WebRequest 类,已经不再被微软推荐了,看看这个页面: Https://learn.microsoft.com/en-us/dotnet/api/system.net.webrequest?view=net-5.0

// create an FTP client and specify the host, username and password
// (delete the credentials to use the "anonymous" account)
FtpClient client = new FtpClient("123.123.123.123", "david", "pass123");


// connect to the server and automatically detect working FTP settings
client.AutoConnect();


// upload a file and retry 3 times before giving up
client.RetryAttempts = 3;
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt",
FtpRemoteExists.Overwrite, false, FtpVerify.Retry);


// disconnect! good bye!
client.Disconnect();