使用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();
}
}
这里有什么问题?
谢谢, 克里斯蒂安斯图尔特
答案 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文件。