c # WebClient Загрузка Zip повреждает его

Загрузка Zip-файлов с помощью веб-клиента, похоже, не работает должным образом для меня, после загрузки и сохранения zip-файл отображается как недействительный или поврежденный и открывается с помощью zip-ридера. Однако с исходным zip-файлом все в порядке, это правильный zip-архив.

Код загрузки:

using (WebClient webClient = new WebClient())
        {
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
            webClient.DownloadFileAsync(new Uri(URL), downloadZipFilename);
        }
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

    private void Completed(object sender, AsyncCompletedEventArgs e)
    {
        //unzip
        using (ZipFile zipFile = ZipFile.Read(currentTemporaryDownloadFileUrl))
        {
            zipFile.ExtractAll(currentTargetFileUrl);
        }
        File.Delete(currentTemporaryDownloadFileUrl);
        DownloadFinished(this,EventArgs.Empty);
        Console.WriteLine("File finished downloading.");
    }

Извлечение zip оказывается поврежденным.

Код сервера:

 //send file
                    e.Response.Connection.Type = HttpServer.Headers.ConnectionType.Close;
                    byte[] buffer = ReadFile(filePath);
                    e.Response.Body.Write(buffer, 0, buffer.Length);

Чтение файла на сервере:

public static byte[] ReadFile(string filePath)
        {
            // this method is limited to 2^32 byte files (4.2 GB)

            FileStream fs = File.OpenRead(filePath);
            try
            {
                byte[] bytes = new byte[fs.Length];
                fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
                fs.Close();
                return bytes;
            }
            finally
            {
                fs.Close();
            }
        }

Что здесь не так?

Спасибо, Кристиан Стюарт.


person Christian Stewart    schedule 25.07.2011    source источник
comment
Возможно, вам не хватает памяти в вашем ReadFile.   -  person Daniel A. White    schedule 25.07.2011
comment
Вы сравнивали загруженный файл с файлом на сервере?   -  person Lasse V. Karlsen    schedule 25.07.2011


Ответы (3)


Вместо того, чтобы неэффективно загружать ZIP-файл в память, а затем записывать его, как насчет использования

e.Response.TransmitFile(filePath);

TransmitFile передает данные непосредственно в выходной поток без буферизации, что сводит к минимуму потребление памяти.

person Steve Morgan    schedule 25.07.2011
comment
А, я вижу, качаю файл на сервер. Позвольте мне посмотреть, как это использовать. - person Christian Stewart; 26.07.2011
comment
Привет, я не могу понять, как это использовать, потому что в переменной ответа нет TransmitFile. Я использую HttpServer, это класс откуда-то, только не помню откуда :) Спасибо за помощь - person Christian Stewart; 26.07.2011

В вызове WebClient вы используете downloadZipFilename, а в методе Completed вы используете currentTemporaryDownloadFileUrl... может быть, метод Completed пытается разархивировать какой-то другой файл и загруженный?

Код вашего сервера поддерживает только ‹= ​​2 ГБ (Int32 - это псевдоним для int, который подписан!) ... возможно, файл больше 2 ГБ? Если файл больше, то коды вашего сервера отправляют для «остального» (более 2 ГБ) все байты как 0x00, что определенно делает ZIP поврежденным...

person Yahia    schedule 25.07.2011
comment
Привет, Это намного меньше, чем 2 ГБ, всего несколько килобайт для теста. Две строки должны быть одинаковыми, они заданы ранее в коде. - person Christian Stewart; 26.07.2011

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

Убедитесь, что сервер «создает и передает zip-файл» работает правильно. Попробуйте попасть на сервер из браузера, убедитесь, что вы можете успешно распаковать zip-файл. Затем добавьте клиент C#, чтобы программно загрузить и распаковать zip-файл.

person Cheeso    schedule 03.08.2011
comment
Что я в конечном итоге сделал здесь (только что понял, что никогда не принимал здесь ответ), так это то, что я упаковывал каждый файл, отправлял его, а затем распаковывал - проблема заключалась в том, что я хранил его в памяти. Вместо этого теперь я просто загружаю файл во временную папку, а затем извлекаю оттуда. - person Christian Stewart; 02.10.2011