使用SaveAs对话框压缩文件并下载它们

时间:2008-12-16 22:00:10

标签: asp.net

我有以下代码来压缩所有文件,然后将其保存到硬盘。我希望压缩所有文件(已完成),然后将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();

        }

5 个答案:

答案 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文件,我会收到相同的错误“文件已损坏”。但是,如果我使用文件浏览器手动转到该文件夹​​并打开该文件,那么它按预期工作。

为什么以及如何?