Как скачать ZipFile с FTP-сервера - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть zip-файл на ftp-сервере, этот zip-файл содержит более одного xml-файла, я хочу скачать этот zip-файл и сохранить его на локальном диске, я записал нижеприведенный код, я загружаю файл, но когда я пытаюсь извлечь этот почтовый индекс выдает мне ошибку, что файл поврежден ......

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + file);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(_remoteUser, _remotePass);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);

StreamWriter writer = new StreamWriter(destination);
writer.Write(reader.ReadToEnd());

writer.Close();
reader.Close();
response.Close();

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Вы передаете результат запроса FTP через StreamReader. Это обычно имеет полезный эффект при работе с кодировкой символов, но это не то, что вы когда-либо хотели бы делать при работе с двоичными данными (то есть zip-файлом). Вместо этого вы должны читать данные непосредственно из потока. Что-то вроде:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + file);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(_remoteUser, _remotePass);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();

// Copy the data from the responseStream to destination 1k at a time (feel free to increase buffer size)
byte[] buffer = new byte[1024];
for (int amountRead = responseStream.Read(buffer, 0, buffer.Length); amountRead > 0; amountRead = responseStream.Read(buffer, 0, buffer.Length))
{
    destination.Write(buffer, 0, amountRead);
}
destination.Flush();

response.Close();
1 голос
/ 14 мая 2012

Вот пример кода для загрузки файла с FTP-сервера

Uri url = new Uri("ftp://ftp.demo.com/file1.txt");
if (url.Scheme == Uri.UriSchemeFtp)
{
    FtpWebRequest objRequest = (FtpWebRequest)FtpWebRequest.Create(url);
    //Set credentials if required else comment this Credential code
    NetworkCredential objCredential = new NetworkCredential("FTPUserName", "FTPPassword");
    objRequest.Credentials = objCredential;
    objRequest.Method = WebRequestMethods.Ftp.DownloadFile;
    FtpWebResponse objResponse = (FtpWebResponse)objRequest.GetResponse();
    StreamReader objReader = new StreamReader(objResponse.GetResponseStream());
    byte[] buffer = new byte[16 * 1024];
    int len = 0;
    FileStream objFS = new FileStream(Server.MapPath("file1.txt"), FileMode.Create, FileAccess.Write, FileShare.Read);
    while ((len = objReader.BaseStream.Read(buffer, 0, buffer.Length)) != 0)
    {
        objFS.Write(buffer, 0, len);
    }
    objFS.Close();
    objResponse.Close();
}
0 голосов
/ 13 декабря 2011

Я думаю, что ваша проблема заключается в том, как вы загружаете zip, вот статья, объясняющая, как его использовать, надеюсь, это поможет:

http://www.vcskicks.com/download-file-ftp.php

Также естьвот такой вот вопрос:

как скачать сжатый файл (.zip) через FTP с помощью c #?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...