Unggah file ke FTP menggunakan C #

112

Saya mencoba mengunggah file ke server FTP dengan C #. File diupload tetapi dengan nol byte.

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 !");
    }
}
webvision
sumber
18
Mengapa hampir 2 tahun kemudian kredensial FTP asli masih berfungsi?
FreeAsInBeer
1
kemungkinan duplikat file Unggah di ftp
Frédéric
Bisakah Anda mencoba apa yang disebutkan dalam pertanyaan @Frederic ditautkan dan kembali ... terlebih lagi tidak jelas api apa yang Anda gunakan untuk upload ftp ...
deostroll

Jawaban:

272

Jawaban yang ada valid, tetapi mengapa menemukan kembali roda dan repot-repot dengan WebRequesttipe tingkat yang lebih rendah sementara WebClientsudah mengimplementasikan unggahan FTP dengan rapi:

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile);
}
Saeb Amini
sumber
39
Hanya satu sen: Anda dapat mengganti string ajaib "STOR" untuk WebRequestMethods.Ftp.UploadFile
Klik Oke
Sayangnya, tampaknya tidak ada cara untuk menggunakan WebClient untuk membuat direktori baru untuk mengunggah file.
danludwig
1
PSA: webrequest tidak lagi direkomendasikan, sekarang ini adalah alternatif resmi
Pacharrin
Halo, apa yang ditunjukkan path.zip dalam metode UploadFile? Apakah saya memerlukan nama file untuk disertakan setelah nama host? Saya hanya memiliki file txt untuk dikirim, saya pikir nama file dan jalur ke file itu disebutkan di localFile.
Skanda
43
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();
    }
}

Cara Penggunaan

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

gunakan ini di depan Anda

dan Anda hanya perlu membuat folder satu kali

untuk membuat folder

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();
cdev
sumber
3
Jawabannya melewatkan panggilan ke request.GetResponse(). Tanpanya, unggahan tidak akan (secara sah) berfungsi di beberapa server. Lihat Cara: Mengunggah File dengan FTP .
Martin Prikryl
Saya tergoda untuk -1 karena diam-diam menelan pengecualian. Bisakah Anda menghapus blok coba-tangkap yang berbahaya itu?
Heinzi
33

Cara termudah

Cara paling sepele untuk mengunggah file ke server FTP menggunakan kerangka .NET menggunakan WebClient.UploadFilemetode :

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

Opsi lanjutan

Jika Anda membutuhkan kontrol yang lebih besar, yang WebClienttidak menawarkan (seperti enkripsi TLS / SSL , mode ASCII, mode aktif, dll), gunakan FtpWebRequest. Cara mudah adalah dengan menyalin FileStreamke aliran FTP menggunakan 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);
}

Pemantauan kemajuan

Jika Anda perlu memantau kemajuan unggahan, Anda harus menyalin sendiri kontennya secara bongkahan:

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

Untuk kemajuan GUI (WinForms ProgressBar), lihat contoh C # di:
Bagaimana kami dapat menampilkan bilah kemajuan untuk mengunggah dengan FtpWebRequest


Mengupload folder

Jika Anda ingin mengunggah semua file dari folder, lihat
Mengunggah direktori file ke server FTP menggunakan WebClient .

Untuk unggahan rekursif, lihat
Unggahan rekursif ke server FTP di C #

Martin Prikryl
sumber
10

Pekerjaan berikut untuk saya:

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();
}

Anda tidak dapat membaca mengirim parameter file dalam kode Anda karena ini hanya nama file.

Gunakan yang berikut ini:

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

Untuk mendapatkan file agar Anda dapat meneruskannya ke Sendmetode.

Björn Mårtensson
sumber
halo, saya punya folder dengan file di dalamnya .. bagaimana saya bisa mengunggahnya ke server FTP? Kode ini saya tidak tahu persis bagaimana ini bekerja?
webvision
di foreach loop panggil metode ini dengan input yang sesuai.
nRk
8
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();
}
Christian Moser
sumber
mengapa Anda menyetel KeepAlive = false? Apakah Anda yakin perlu requestStream.Close ()? Anda menggunakan requestStream di dalam menggunakan jadi saya pikir itu akan menutup alirannya sendiri.
Kate
2

Pada contoh pertama harus mengubahnya menjadi:

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

Siram pertama dan setelah itu tutup.

marik
sumber
1

Ini berfungsi untuk saya, metode ini akan melakukan SFTP file ke lokasi dalam jaringan Anda. Ini menggunakan perpustakaan SSH.NET.2013.4.7. Seseorang dapat mengunduhnya secara gratis.

    //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();
        }
    }
C. Poh
sumber
Jawaban ini sepertinya satu-satunya solusi untuk SFTP saya. Menunggu untuk mengujinya.
Olorunfemi Ajibulu
1

tanggal publikasi: 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}");
        }
    }
}
}
Uzay
sumber
0

Saya telah mengamati bahwa -

  1. FtpwebRequest hilang.
  2. Karena targetnya adalah FTP, maka diperlukan NetworkCredential.

Saya telah menyiapkan metode yang berfungsi seperti ini, Anda dapat mengganti nilai variabel ftpurl dengan parameter TargetDestinationPath. Saya telah menguji metode ini pada aplikasi 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();
        }

Beri tahu saya jika ada masalah, atau berikut satu tautan lagi yang dapat membantu Anda:

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

Kshitij Jhangra
sumber