Si encuentras algo que no entiendes puedes dejarlo en los comentarios y te ayudaremos rápidamente.
Solución:
Las respuestas existentes son válidas, pero ¿por qué reinventar la rueda y molestarse con un nivel más bajo? WebRequest
tipos mientras WebClient
ya implementa la carga de FTP perfectamente:
using (var client = new WebClient())
client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile);
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();
Cómo utilizar
UploadFtpFile("testFolder", "E:\filesToUpload\test.img");
usa esto en tu foreach
y solo necesita crear la carpeta una vez
para crear una carpeta
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();
La manera más fácil
La forma más trivial de cargar un archivo a un servidor FTP usando .NET framework es usando WebClient.UploadFile
método:
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", @"C:localpathfile.zip");
Opciones avanzadas
Si necesitas un mayor control, eso WebClient
no ofrece (como encriptación TLS/SSL, modo de transferencia de texto/ascii, modo activo, reanudación de transferencia, monitoreo de progreso, etc.), uso FtpWebRequest
. La manera fácil es simplemente copiar un FileStream
a un flujo FTP usando 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:localpathfile.zip"))
using (Stream ftpStream = request.GetRequestStream())
fileStream.CopyTo(ftpStream);
Seguimiento del progreso
Si necesita monitorear el progreso de una carga, debe copiar los contenidos por partes usted mismo:
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:localpathfile.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);
Para el progreso de la GUI (WinForms ProgressBar
), consulte el ejemplo de C# en:
¿Cómo podemos mostrar la barra de progreso para cargar con FtpWebRequest?
Cargando carpeta
Si desea cargar todos los archivos de una carpeta, consulte
Cargue el directorio de archivos al servidor FTP utilizando WebClient.
Para una carga recursiva, consulte
Carga recursiva al servidor FTP en C#