Загрузите и загрузите двоичный файл на / из FTP-сервера в C # /. NET

Я использую .NET 4 C #. Я пытаюсь загрузить, а затем загрузить ZIP-файл на (мой) сервер.

Для загрузки у меня есть

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

Кажется, это работает, потому что я получаю файл на сервере нужного размера.

1) Как мне передать его, а не сначала загружать в память? Я буду загружать очень большие файлы.

И для скачивания у меня есть

 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) Кажется, все работает … за исключением случаев, когда я пытаюсь разархивировать загруженный ZIP-файл, я получаю недопустимый ZIP-файл.

Загрузить

Самый тривиальный способ загрузки двоичного файла на FTP-сервер с использованием платформы .NET – это использование 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 . Простой способ – просто скопировать stream 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 ) см.
Как мы можем показать индикатор выполнения для загрузки с помощью FtpWebRequest

Если вы хотите загрузить все файлы из папки, см.
Загрузите каталог файлов с помощью WebClient .


Скачать

Самый тривиальный способ загрузки двоичного файла с FTP-сервера с использованием .NET framework – это использование 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"); 

Если вам нужен больший контроль, этот WebClient не предлагает (например, шифрование TLS / SSL и т. Д.), Используйте FtpWebRequest . Легкий способ – просто скопировать stream ответов FTP в FileStream с помощью 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); } 

Если вам нужно отслеживать ход загрузки, вам нужно скопировать содержимое самими кусками:

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

Для достижения GUI (WinForms ProgressBar ) см.
Загрузка FTP-сервера FtpWebRequest с помощью ProgressBar

Если вы хотите загрузить все файлы из удаленной папки, см.
C # Загрузка всех файлов и подкаталогов через FTP .

  • Распаковка gzip-ответа от WebClient
  • Возможно ли передать аутентификацию из Webbrowser в WebRequest
  • Войдите на сайт, через C #
  • Автоматически распаковывать ответ gzip через WebClient.DownloadData
  • Как мне войти на сайт с помощью WebClient?
  • Какая разница между classами WebClient и HTTPWebRequest в .NET?
  • C # - Как сделать HTTP-вызов
  • ASP.NET-controller: asynchronous модуль или обработчик завершен, пока асинхронная операция все еще находится на рассмотрении
  • C # webclient и прокси-сервер
  • Использование CookieContainer с classом WebClient
  • Аутентификация и запрос временной шкалы пользователя с помощью API Twitter 1.1 oAuth
  • Interesting Posts

    Xcode – профиль iPhone не соответствует какой-либо действительной паре с сертификатом / закрытым ключом в ключевом ключе по умолчанию

    Регулярное выражение для пароля должно содержать не менее восьми символов, как минимум одно число и буквы нижнего и верхнего регистра и специальные символы

    Как связать с паролем в MVVM

    Разрешить CREATE DATABASE в базе данных «master» (сначала код EF)

    прозрачная панель действий с AppCompat-v7 21

    Максимальное количество одновременных HttpWebRequests

    В чем разница между консолью, терминалом и командной строкой?

    Как я имитирую статические методы в classе с помощью easymock?

    Закрытие окна недостаточно для закрытия приложения в Mac OS X

    size_t vs. uintptr_t

    Как переключаться между языками в Windows 10, как в OS X?

    Как получить текущую географическую широту и долготу в андроиде

    Что является хорошим прецедентом для статического импорта методов?

    Веб-сайты не загружаются в Firefox, но работают в Chrome и Internet Explorer

    JFreeChart PolarPlot: математическая ориентация

    Давайте будем гением компьютера.