2

我有这个功能,我用它来压缩用户会话中的文件列表,然后将其流式传输到用户的浏览器以供下载:

public static void DownloadAllPhotos()
{
    HttpContext.Current.Response.AddHeader(
        "Content-Disposition", "attachment; filename=Photos.zip");
    HttpContext.Current.Response.ContentType = "application/zip";

    List<string> photos= new List<string>();

    if (HttpContext.Current.Session != null && 
        HttpContext.Current.Session["userPhotos"] != null)
    {
        photos = (List<string>)HttpContext.Current.Session["userPhotos"];
    }

    using (var zipStream = new 
        ZipOutputStream(HttpContext.Current.Response.OutputStream))
    {
        foreach (string photoUrl in photos)
        {
            byte[] fileBytes = File.ReadAllBytes(photoUrl);

            var fileEntry = new ZipEntry(
                Path.GetFileName(photoUrl))
            {
                Size = fileBytes.Length
            };

            zipStream.PutNextEntry(fileEntry);
            zipStream.Write(fileBytes, 0, fileBytes.Length);
        }

        zipStream.Flush();
        zipStream.Close();

        // reset session
        HttpContext.Current.Session["userPhotos"] = new List<string>();
    }
}

当用户在他们的会话中有照片 url,并且他们点击一个按钮来调用这个函数时,文件被压缩并在用户的浏览器中开始下载。

但是当我尝试打开压缩文件时,我得到了这个错误:

Windows 无法打开该文件夹。

压缩文件夹“{Path to my file}”无效。

我做错了什么导致这个错误吗?

4

2 回答 2

3

这个例子Response.Flush中检查and的位置,看看写类似的东西是否能解决问题。ZipEntry.CleanName

于 2013-03-13T03:32:26.393 回答
0

同样根据@cfeduke 回答中的示例,“在 IIS 中创建 Zip 作为浏览器下载附件”中有一条评论,建议更改 Response.ContentType = "application/octet-stream" 而不是 "application/zip"

// 如果浏览器接收到损坏的 zip 文件,IIS 压缩可能会导致此问题。一些成员发现 //Response.ContentType = "application/octet-stream" 已经解决了这个问题。可能特定于 Internet Explorer。

为我工作。而且它不是 IE 特定的(我使用 Chrome)。

于 2017-11-16T21:03:19.753 回答