Загрузить файл на FTP с помощью C#
Я пытаюсь загрузить файл на FTP-сервер с помощью C#. Файл загружен, но с нулевыми байтами.
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 !");
}
}
9 ответов:
существующие ответы действительны, но зачем заново изобретать колесо и беспокоиться о более низком уровне
WebRequestтипы в то время какWebClientуже реализует FTP загрузку аккуратно:using (WebClient client = new WebClient()) { client.Credentials = new NetworkCredential(ftpUsername, ftpPassword); client.UploadFile("ftp://ftpserver.com/target.zip", WebRequestMethods.Ftp.UploadFile, localFilePath); }
public void UploadFtpFile(string folderName, string fileName) { FtpWebRequest request; try { 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(); } } catch (Exception ex) { } }как использовать
UploadFtpFile("testFolder", "E:\filesToUpload\test.img");используйте это в вашем foreach
и нужно только создать папку один раз
создать папку
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();
следующие работы для меня:
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(); }вы не можете прочитать параметр отправить файл в коде, так как это только имя файла.
использовать следующий:
byte[] bytes = File.ReadAllBytes(dir + file);чтобы получить файл, так что вы можете передать его в
Sendметод.
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(); }нашел его здесь:http://www.snippetsource.net/Snippet/127/upload-a-file-with-ftp-in-c
самый простой способ загрузить файл на FTP-сервер с помощью .NET framework-это использование
WebClient.UploadFileметод:WebClient client = new WebClient(); client.Credentials = new NetworkCredential("username", "password"); client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip");Если вам нужен больший контроль, что
WebClientне предлагает (например, шифрование TLS / SSL и т. д.), ИспользуйтеFtpWebRequest. Простой способ-просто скопироватьFileStreamк потоку FTP с помощьюStream.CopyTo:FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); 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); }Если вам нужно отслеживать ход загрузки, вы должны скопировать содержимое по кускам вы сами:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); 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.
в первом примере необходимо изменить их на:
requestStream.Flush(); requestStream.Close();Ассам и после этого закрыть.
это работает для меня, этот метод будет 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(); } }
дата публикации: 06/26/2018
https://docs.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", "[email protected]"); // 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}"); } } } }
Я заметил, что -
- FtpwebRequest отсутствует.
- поскольку целью является FTP, поэтому требуется NetworkCredential.
Я подготовил метод, который работает следующим образом, вы можете заменить значение переменной ftpurl с параметром TargetDestinationPath. Я протестировал этот метод на приложении winforms:
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
Comments