Unggah dan unduh file ke / dari server FTP di C # /. NET

Jun 17 2017

Saya menggunakan .NET 4 C #. Saya mencoba mengunggah dan kemudian mengunduh file ZIP ke server (saya).

Untuk mengunggah saya punya

using (WebClient client = new WebClient())
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(MyUrl);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.EnableSsl = false;
    request.Credentials = new NetworkCredential(MyLogin, MyPassword);
    byte[] fileContents = null;
    using (StreamReader sourceStream = new StreamReader(LocalFilePath))
    {
        fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
    }
    request.ContentLength = fileContents.Length;
    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(fileContents, 0, fileContents.Length);
    }
    FtpWebResponse response = null;
    response = (FtpWebResponse)request.GetResponse();
    response.Close();
}

Ini sepertinya berhasil, karena saya mendapatkan file di server dengan ukuran yang tepat.

1) Bagaimana cara mengalirkannya, daripada memuatnya ke dalam memori terlebih dahulu? Saya akan mengupload file yang sangat besar.

Dan untuk mengunduh saya punya

using (WebClient client = new WebClient())
{
    string HtmlResult = String.Empty;
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(remoteFile);
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    request.EnableSsl = false;
    request.Credentials = new NetworkCredential(MyLogin, MyPassword);
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
    using (FileStream writer = new FileStream(localFilename, FileMode.Create))
    {
        long length = response.ContentLength;
        int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte[2048];
        readCount = responseStream.Read(buffer, 0, bufferSize);
        while (readCount > 0)
        {
            writer.Write(buffer, 0, readCount);
            readCount = responseStream.Read(buffer, 0, bufferSize);
        }
    }
}

2) Semuanya tampak berfungsi ... kecuali ketika saya mencoba mengekstrak file ZIP yang diunduh, saya mendapatkan file ZIP yang tidak valid.

Jawaban

16 MartinPrikryl Jun 17 2017 at 19:20

Unggah

Cara paling sederhana untuk mengunggah file biner ke server FTP menggunakan kerangka .NET menggunakan 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");

Jika Anda membutuhkan kontrol yang lebih besar, yang WebClienttidak menawarkan (seperti enkripsi TLS / SSL , dll), gunakan FtpWebRequest. Cara mudahnya adalah dengan menyalin FileStreamaliran ke 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);
}

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:
Bagaimana kami dapat menampilkan bilah kemajuan untuk mengunggah dengan FtpWebRequest

Jika Anda ingin mengupload semua file dari folder, lihat
Upload berulang ke server FTP di C # .


Unduh

Cara paling sederhana untuk mendownload file biner dari server FTP menggunakan framework .NET menggunakan WebClient.DownloadFile:

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

Jika Anda membutuhkan kontrol yang lebih besar, yang WebClienttidak menawarkan (seperti enkripsi TLS / SSL , dll), gunakan FtpWebRequest. Cara mudah adalah dengan menyalin aliran respons FTP untuk FileStreammenggunakan 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.DownloadFile;

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

Jika Anda perlu memantau kemajuan pengunduhan, Anda harus menyalin sendiri kontennya sendiri:

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

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

Untuk kemajuan GUI (WinForms ProgressBar), lihat:
FtpWebRequest FTP download dengan ProgressBar

Jika Anda ingin mendownload semua file dari folder jauh, lihat
C # Download semua file dan subdirektori melalui FTP .