c # WebClient Загрузка Zip повреждает его - PullRequest
0 голосов
/ 25 июля 2011

Загрузка файлов 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.");
    }

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

Код сервера:

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

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

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

Ответы [ 3 ]

0 голосов
/ 25 июля 2011

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

e.Response.TransmitFile(filePath);

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

0 голосов
/ 03 августа 2011

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

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

0 голосов
/ 25 июля 2011

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

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

...