我有以下代码来压缩所有文件,然后将其保存到硬盘。我希望压缩所有文件(已完成),然后将zip文件附加到Response流,以便用户可以选择保存它!
protected void DownloadSelectedFiles_Click(object sender, EventArgs e)
{
string path = String.Empty;
string zipFilePath = @"C:\MyZipFile.zip";
ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipFilePath));
byte[] buffer = new byte[4096];
foreach (GridViewRow row in gvFiles.Rows)
{
bool isSelected = (row.FindControl("chkSelect") as CheckBox).Checked;
if (isSelected)
{
path = (row.FindControl("lblUrl") as Label).Text;
ZipEntry entry = new ZipEntry(Path.GetFileName(path));
entry.DateTime = DateTime.Now;
zipStream.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(path))
{
int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
zipStream.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
}
zipStream.Finish();
zipStream.Close();
Response.ContentType = "application/x-zip-compressed";
Response.AppendHeader("Content-Disposition", "attachment; filename=SS.zip");
Response.WriteFile(zipFilePath);
Response.End();
}
答案 0 :(得分:1)
如果你正在使用IE浏览器,请检查它是不是旧的“缓存已满”-bug显示其丑陋的面孔。
如果您将IE设置为自动刷新或在IE启动时刷新并且第一次下载该zip文件,则可能是在您修复例程后它使用该zip文件的缓存版本并得到了一个很好的拉链。
尝试添加:
Response.Buffer = true;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
在Response.ContentType之前并添加:
Response.Flush()
Response.Close()
在response.end之前,看看是否有任何改变。
结果如下:
Response.Buffer = true;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/x-zip-compressed";
Response.AppendHeader("Content-Disposition", "attachment; filename=SS.zip");
Response.WriteFile(zipFilePath);
Response.Flush()
Response.Close()
Response.End();
只是从心灵的顶部提供一些提示。
答案 1 :(得分:1)
我在博客上发布过这样的文件。你可能会在那里找到一些有用的东西。
http://absolutecobblers.blogspot.com/2008/02/downloading-and-deleting-temporary.html
答案 2 :(得分:0)
还有一个长镜头,尝试将mime类型设置为application / unknown,在这篇文章中似乎有部分解决方案的海报问题:
http://jamesewelch.com/2008/12/03/sharpziplib-and-windows-extraction-wizard-errors/
答案 3 :(得分:0)
我还尝试将zip文件保存到服务器文件夹,然后给用户下载链接,但它说“文件已损坏”。这很奇怪,因为如果我访问我的服务器文件夹并手动打开它,我可以打开相同的文件夹!
答案 4 :(得分:0)
这是我发现的另一件事。如果我将zip文件保存在Server的文件夹中,然后使用url:http://localhost/MyApplication/ServerFolder/MyZipFile.zip引用它。
如果我转到网址并下载zip文件,我会收到相同的错误“文件已损坏”。但是,如果我使用文件浏览器手动转到该文件夹并打开该文件,那么它按预期工作。
为什么以及如何?