首页 > 解决方案 > 如何将现有文件(图像/mp4/pdf)添加到 ziparchive?- .Net 框架 4.6.2

问题描述

我正在尝试实现一个“全部下载”按钮,该按钮将从服务器压缩选择的文件并将它们作为 zip 文件下载返回。使用下面的代码,我创建了 zip 文件。预期的文件在里面,文件名是预期的,但压缩文件的内容似乎已损坏。

public ActionResult DownloadAll(Guid id)
{
    var assets = db.InviteAssets.Include(i => i.AssetPages).Where(w => w.InviteID == id).ToList();

    var cd = new System.Net.Mime.ContentDisposition
    {
        // for example foo.bak
        FileName = "allAssets.zip",

        // always prompt the user for downloading, set to true if you want 
        // the browser to try to show the file inline
        Inline = false,
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());

    using (var memoryStream = new MemoryStream())
    {
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
        {
            foreach (var asset in assets)
            {
                string path, extension, name;
                if (asset.AssetType != AssetType.PDF)
                {
                    path = asset.AssetPages.First(f => f.PageNumber == 1).FilePath;
                }
                else
                {
                    path = string.Format("/Content/Assets/asset_{0}.pdf", asset.ID);
                }
                extension = path.Substring(path.IndexOf('.'));
                name = "asset" + asset.Order + extension;

                var file = archive.CreateEntry(name);

                using (var streamWriter = new StreamWriter(file.Open()))
                {
                    using (var fileStream = System.IO.File.Open(Server.MapPath("~" + path), FileMode.Open))
                    {
                        int filelength = (int)fileStream.Length;
                        var filedata = new byte[fileStream.Length];
                        streamWriter.Write(fileStream.Read(filedata, 0, filelength));
                    }
                }
            }
        }

        return File(memoryStream.ToArray(), "application/json", "allAssets.zip");
    }
}

因此,我认为我的问题与本节有关:

using (var streamWriter = new StreamWriter(file.Open()))
{
    using (var fileStream = System.IO.File.Open(Server.MapPath("~" + path), FileMode.Open))
    {
        int filelength = (int)fileStream.Length;
        var filedata = new byte[fileStream.Length];
        streamWriter.Write(fileStream.Read(filedata, 0, filelength));
    }
}

我一直在阅读使用方法archive.CreateEntryFromFile(filePath, fileName)但没有识别出这样的方法的示例。这是否已被弃用,或者需要更高版本的 .Net Framework?

提前致谢。

标签: c#asp.net-mvczip

解决方案


问题在这里:

streamWriter.Write(fileStream.Read(filedata, 0, filelength));

您正在将文件内容读入filedata,但同时将返回值Read写入存档,这意味着单个 int。你需要分别读写:

fileStream.Read(filedata, 0, filelength));
streamWriter.Write(filedata, 0, filelength);

或者您可以使用命名空间中的CreateEntryFromFile扩展方法System.IO.Compression.ZipFileExtensions


推荐阅读