当前位置: 首页 > 知识库问答 >
问题:

从字节[]创建zip文件

尚嘉勋
2023-03-14

我正在尝试用一系列字节数组在.NET4.5(System.IO.Compression)中创建一个Zip文件。例如,从我正在使用的API中,我得到了一个<code>列表

现在我的感觉是,我必须将每个附件写到磁盘上,然后从磁盘创建zip文件。

//This is great if I had the files on disk
ZipFile.CreateFromDirectory(startPath, zipPath);
//How can I create it from a series of byte arrays?

共有3个答案

微生善
2023-03-14

GZipStream和DeflateStream似乎可以让您使用流/字节数组来解决问题,但可能大多数用户无法使用压缩文件格式。(即,您的文件将具有.gz扩展名)如果此文件仅在内部使用,则可能没问题。

我不知道如何使用Microsoft的库制作ZIP,但我记得这个库支持您可能会发现有用的东西: http://sevenzipsharp.codeplex.com/

它是在LGPL名下注册的。

吴峰
2023-03-14

这是OP发布的公认答案的变体。然而,这是针对WebForms而不是MVC的。我假设caseAttachmentModel.Body是一个字节[]

基本上一切都是一样的,只是增加了一个方法,将zip作为响应发送出去。

using (var compressedFileStream = new MemoryStream()) {
    //Create an archive and store the stream in memory.
    using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false))         {
     foreach (var caseAttachmentModel in caseAttachmentModels) {
        //Create a zip entry for each attachment
        var zipEntry = zipArchive.CreateEntry(caseAttachmentModel.Name);

        //Get the stream of the attachment
        using (var originalFileStream = new MemoryStream(caseAttachmentModel.Body)) {
                using (var zipEntryStream = zipEntry.Open()) {
                    //Copy the attachment stream to the zip entry stream
                    originalFileStream.CopyTo(zipEntryStream);
                }
            }
        }
    }
    sendOutZIP(compressedFileStream.ToArray(), "FileName.zip");
}

private void sendOutZIP(byte[] zippedFiles, string filename)
{
    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.ContentType = "application/x-compressed";
    Response.Charset = string.Empty;
    Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
    Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
    Response.BinaryWrite(zippedFiles);
    Response.OutputStream.Flush();
    Response.OutputStream.Close();
    Response.End();
}

我还想指出,@Levi Fuller对公认答案中的参考文献给出的建议是正确的!

尹昀
2023-03-14

经过一段时间的玩耍和阅读,我终于明白了这一点。以下是如何在不将任何临时数据写入磁盘的情况下创建包含多个文件的zip文件(归档文件):

using (var compressedFileStream = new MemoryStream())
{
    //Create an archive and store the stream in memory.
    using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, false)) {
        foreach (var caseAttachmentModel in caseAttachmentModels) {
            //Create a zip entry for each attachment
            var zipEntry = zipArchive.CreateEntry(caseAttachmentModel.Name);

            //Get the stream of the attachment
            using (var originalFileStream = new MemoryStream(caseAttachmentModel.Body))
            using (var zipEntryStream = zipEntry.Open()) {
                //Copy the attachment stream to the zip entry stream
                originalFileStream.CopyTo(zipEntryStream);
            }
        }
    }

    return new FileContentResult(compressedFileStream.ToArray(), "application/zip") { FileDownloadName = "Filename.zip" };
}
 类似资料:
  • 问题内容: 这是我用来创建带有密码的文件的代码 但是它设置密码而不是密码,符号将被忽略。为什么? 问题答案: ^字符是命令外壳程序中的转义字符。尝试加倍。

  • 问题内容: 所以-我有一个需要a 作为输入的第三方库。我有一个。 我不想将字节写入磁盘..我想将其保留在内存中。我如何从提供的内容创建一个想法(无需写入磁盘)? 问题答案: 抱歉,不可能。除非您具有RAM磁盘,否则File本质上是磁盘上的实体-但这不是您可以用Java创建的东西。 这正是API不应该基于File对象(或过载以接受InputStream)的原因。

  • 问题内容: 我正在尝试将 文件 从 一个文件夹 保存到 另一个 文件夹 。 zip文件夹 放置在其他目录中。而且我编写了以下代码: archive.php 但是可惜我无法创建.zip文件夹。我错过了任何一步吗? 问题答案: TEST是您的项目文件夹名称。 您可以根据需要定义路径。

  • 如何在Pharo中创建zip文件并将其写入磁盘? 同样,/也是不可用的,因为该实现只能在实际磁盘上工作,而不能在内存中工作。 那么,是否有其他方法(或外部库),我可以压缩我的数据,而不需要转储所有文件到磁盘,压缩到那里,并读取最后的文件回来?

  • 问题内容: 我有大量的数据(几场演出),我需要用Python编写一个zip文件。我无法一次全部将其加载到内存中以传递给ZipFile的.writestr方法,我真的不想使用临时文件将其全部馈入磁盘,然后再读回。 有没有办法将生成器或类似文件的对象提供给ZipFile库?还是由于某种原因似乎不支持此功能? 压缩文件是指压缩文件。如Python zipfile包中所支持。 问题答案: 唯一的解决方案是

  • 问题内容: 我正在尝试从.Net创建一个Zip文件,该文件可以从Java代码读取。 我已经使用SharpZipLib创建了Zip文件,但是如果生成的文件根据#ZipLib库的CheckZip函数是有效的,并且可以通过WinZip或WinRar成功解压缩,则在尝试使用Java对其进行解压缩时总是会收到错误消息Java中的.Utils.Zip类。 问题似乎出在SharpZipLib写的错误标题中,我还

  • 问题内容: 我需要创建一个Zip文件,该文件由位于我的s3存储桶中的一系列文件(视频和图像)组成。 目前使用以下代码的问题是,我很快达到了Lambda的内存限制。 使用Lambda是否有可能,还是我应该采用其他方法? 是否可以即时写入压缩的zip文件,从而在某种程度上消除内存问题,还是我需要在压缩之前收集文件? 任何帮助将非常感激。 问题答案: 好的,我今天必须这样做,并且可以正常工作。直接缓冲区

  • 我试图在ZIP文件内创建一个ZIP文件,以重新构建以前在内存中的zip结构,我在Java。 我失败了,因为我得到了一个错误的内部ZIP内创建的初始ZIP文件。文件已损坏。当试图打开它时,我得到一个“文件的意外结局”。 我得到了这个结构: -input.zip--InnerInput.zip 代码使用java Stack和Map在内存中解压。然后它创建input2.zip,内部nput.zip。 总