我正在try 从byte[]创建一个Zip文件,并将Zip文件作为byte[]返回,但是当我将字节上传到BLOB存储时,当我下载该Zip文件时,它是无效的.

代码:

byte[] zipBytes;
using (var zipMemoryStream = new MemoryStream())
{
    using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create, true))
    {
        var zipExcelEntry = archive.CreateEntry(
           $"SAR-{subjectAccessRequest.Basic.FirstName}-{subjectAccessRequest.Basic.LastName}_{DateTime.Now:yyyyMMddHHmmss}.xlsx",
           CompressionLevel.Fastest);

        using (var excelEntryFile = zipExcelEntry.Open()) excelEntryFile.Write(stream.ToArray(), 0, (int)stream.Length);

        zipBytes = zipMemoryStream.ToArray();

    };
};

return zipBytes;

在创建zip文件时,我在这里做了什么明显的错误吗?

上传到BLOB存储的代码已经过测试,所以问题应该出在这里

推荐答案

您需要在ToArray流之前关闭存档.

您还应该在内部文件流上使用CopyTo.

using var zipMemoryStream = new MemoryStream();

using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create, true))
{
    var zipExcelEntry = archive.CreateEntry(
           $"SAR-{subjectAccessRequest.Basic.FirstName}-{subjectAccessRequest.Basic.LastName}_{DateTime.Now:yyyyMMddHHmmss}.xlsx",
           CompressionLevel.Fastest);

    using (var excelEntryFile = zipExcelEntry.Open())
        stream.CopyTo(excelEntryFile);
};
var zipBytes = zipMemoryStream.ToArray();
return zipBytes;

理想情况下,您只需返回整个压缩流,而不是创建新的字节数组,因为这样效率更高.

var zipMemoryStream = new MemoryStream();

using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create, true))
{
    var zipExcelEntry = archive.CreateEntry(
           $"SAR-{subjectAccessRequest.Basic.FirstName}-{subjectAccessRequest.Basic.LastName}_{DateTime.Now:yyyyMMddHHmmss}.xlsx",
           CompressionLevel.Fastest);

    using (var excelEntryFile = zipExcelEntry.Open())
        stream.CopyTo(excelEntryFile);
};

zipMemoryStream.Position = 0;  // reset position to beginning
return zipMemoryStream;

Csharp相关问答推荐

在依赖性注入和继承之间进行 Select

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

Blazor Foreach仅渲染最后一种 colored颜色

(乌龙)1&#比c#中的UL&#慢吗?

Thad.Sept()vs Task.Delay().Wait()

System.Net.Http.HttpClient.SendAsync(request)在docker容器内的POST方法30秒后停止

ASP.NET Core AutoMapper:如何解决错误 CS0121调用在以下方法或属性之间不明确

在此系统上已禁用获取正在运行的脚本.&在ASP.NET Core Web API中

由于POST中的应用程序/JWT,出现不支持的内容类型异常

HttpClient 415不支持的媒体类型错误

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

{ or ; expected error如何解决此问题

Visual Studio 17.8.0制表符自动完成问题--三缩进

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

try 访问字典中的模拟对象时引发KeyNotFoundException

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

Azure队列触发器未使用隔离的工作进程执行

.NET EF Core Automapper项目到筛选不起作用

方法加载时出现类型加载异常