Загрузите и загрузите двоичный файл на / из 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-файл.

One Solution collect form web for “Загрузите и загрузите двоичный файл на / из FTP-сервера в C # /. NET”

Загрузить

Самый тривиальный способ загрузки двоичного файла на 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 .

  • Как мне войти на сайт с помощью WebClient?
  • Выбор между HttpClient и WebClient
  • Какая разница между classами WebClient и HTTPWebRequest в .NET?
  • Войдите на сайт, через C #
  • Автоматически распаковывать ответ gzip через WebClient.DownloadData
  • Возможно ли передать аутентификацию из Webbrowser в WebRequest
  • Как я могу заставить WebClient использовать Cookies?
  • C # WebClient отключить кеш
  • Как получить строку json из url?
  • Печально известная, но без ответа проблема загрузки файла, когда требуется защита Windows
  • Аутентификация и запрос временной шкалы пользователя с помощью API Twitter 1.1 oAuth
  • Interesting Posts

    Заполнение выпадающего списка HTML в JSP со значениями, полученными из базы данных в Servlet

    MVC HTML Helpers и выражения lambda

    Android: требуется запись микрофонного входа

    Что регулирует дросселирование процессора Intel SpeedStep? Могу ли я получить контроль над этим на Windows7?

    c # Изменение размера изображения до разного размера при сохранении соотношения сторон

    Простые расчеты для работы с расстоянием лат / lon + km?

    Создание временных файлов на Android

    Совместимые с Mac средства веб-разработки

    Стратегии совместного использования паролей для нескольких пользователей, таких как жена мужа?

    Как переименовать папку пользователя в Windows 10?

    Сжатые сообщения Sendto не работают с Vista

    Outlook 2013 с GMail Over IMAP не хватает всей почтовой папки

    Как получить список имен листов ms-excel?

    SSH ProxyCommand на стороне сервера SSH

    Java 8 Iterable.forEach () vs foreach loop

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