咨询区
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
大佬🐂👃。