如何将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返回的内容是否合法,可以先做个简单验证:
- 把
fileBytes直接保存成.zip文件 - 用解压工具尝试打开
- 能打开:说明API返回的是现成Zip,用情况1的代码即可
- 打不开:要么是API返回的数据有误,要么是下载过程中数据损坏,可以用Postman测试API,对比返回的响应内容是否符合预期
内容的提问来源于stack exchange,提问作者Dev_101
相关产品推荐
相关产品推荐

