c#WebClient正在下载Zip会破坏它

时间:2011-07-25 17:14:47

标签: c# download zip webserver

使用webclient下载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);

服务器上的Readfile:

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 :(得分:0)

WebClient调用中,您使用downloadZipFilename,而Completed方法使用currentTemporaryDownloadFileUrl ...可能是Completed方法尝试解压一些其他文件和下载的文件?

您的服务器代码仅支持< = 2 GB(Int32是已签名的int的别名!)...文件是否大于2 GB? 如果文件较大,那么你的服务器代码发送“休息”(大于2 GB)所有字节为0x00,这肯定会使ZIP损坏......

答案 1 :(得分:0)

而不是低效地将ZIP文件加载到内存中,然后将其写出来,如何使用

e.Response.TransmitFile(filePath);

TransmitFile直接流到输出流而不进行缓冲,从而最大限度地减少内存消耗。

答案 2 :(得分:0)

我建议您从客户端读取和解压缩中解除服务器传输。这样你就可以隔离出现的任何问题。

确保服务器“创建并传输zip文件”正常工作。尝试从浏览器访问服务器,确保您可以成功解压缩zip文件。然后添加C#客户端,以编程方式下载并解压缩zip文件。