You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将RestSharp获取的octet-stream响应正确保存为带目录结构的Zip文件?

解决方法分析与代码示例

看起来你现在的问题出在对下载字节流的处理逻辑上,我来一步步帮你理清:

先定位当前代码的问题

你现在用DotNetZip把整个下载到的字节数组当成一个单独的entry("test")塞进了新Zip里,这相当于生成了一个「嵌套Zip」——里面只有一个叫test的文件,而这个文件的内容其实是API返回的原始Zip数据。系统会把它当成普通文件而非Zip来解析,自然打不开。

接下来分两种情况解决你的需求:


情况1:API确实返回的是合法Zip文件字节流

如果API返回的octet-stream本身就是符合要求的Zip(包含你需要的目录结构和文件),那你完全不需要用DotNetZip二次打包,直接把字节数组写入本地文件即可:

// 直接保存下载到的字节数组,跳过DotNetZip的打包步骤
File.WriteAllBytes(filePath, fileBytes);

这样生成的文件就是API返回的原始Zip,应该能正常打开。


情况2:API返回的是未压缩的原始文件集合(需要你手动构建Zip结构)

如果API返回的是零散文件的合并字节流(而非现成Zip),那你需要先拆分出各个文件的内容,再用DotNetZip构建指定的目录结构。示例代码如下:

假设你已经从响应中拆分出了各个文件的字节数据(比如detailsJsonBytes是details.json的字节、imageFiles是图片文件名和字节的字典):

// 定义根目录名称
string rootFolder = "296927a0-5ac7-4ccd-9928-bd74ef7ae68a_20200227074457";

using (ZipFile zip = new ZipFile())
{
    // 添加根目录下的JSON文件
    zip.AddEntry($"{rootFolder}/details.json", detailsJsonBytes);
    zip.AddEntry($"{rootFolder}/achievements.json", achievementsJsonBytes);
    zip.AddEntry($"{rootFolder}/evaluation.json", evaluationJsonBytes);

    // 添加images文件夹下的所有图片
    foreach (var image in imageFiles)
    {
        // 路径格式:根目录/images/图片文件名
        zip.AddEntry($"{rootFolder}/images/{image.Key}", image.Value);
    }

    // 保存到指定路径
    zip.Save(filePath);
}

额外排查步骤

如果不确定API返回的内容是否合法,可以先做个简单验证:

  1. 把fileBytes直接保存成.zip文件
  2. 用解压工具尝试打开
    • 能打开:说明API返回的是现成Zip,用情况1的代码即可
    • 打不开:要么是API返回的数据有误,要么是下载过程中数据损坏,可以用Postman测试API,对比返回的响应内容是否符合预期

内容的提问来源于stack exchange,提问作者Dev_101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:37:47