如何将修改后的ZipArchive保存到流并上传至服务器?
解决方法
要将修改后的ZipArchive保存到流中用于上传,需要注意ZipArchive的Update模式对底层流的要求,以及修改后的流处理逻辑,具体实现如下:
关键注意事项
ZipArchive在Update模式下要求底层流必须支持读写和随机访问(查找),因此如果原下载流是不可查找的类型(如网络流),需要先将其复制到MemoryStream中操作。- 修改完成后必须释放
ZipArchive,确保所有修改写入底层流,之后需要重置流的位置到开头才能正常读取上传。
修改后的代码示例
public IActionResult DeleteZippedFile(string path) { // 将原Zip文件下载到可读写的MemoryStream中 using var originalStream = new MemoryStream(); using var downloadStream = DownloadStream(Request.Cookies["OpenedZipPath"]); downloadStream.CopyTo(originalStream); originalStream.Position = 0; // 重置流位置到开头 // 在MemoryStream上打开ZipArchive进行修改 using (var zip = new ZipArchive(originalStream, ZipArchiveMode.Update, leaveOpen: true)) { // 查找要删除的条目,避免找不到时索引越界 var entryToDelete = zip.Entries.FirstOrDefault(x => x.Name == path); if (entryToDelete != null) { entryToDelete.Delete(); } else { return BadRequest("指定文件不存在于Zip压缩包中"); } } // 释放ZipArchive,此时所有修改已写入originalStream // 重置流位置到开头,准备上传 originalStream.Position = 0; // 上传修改后的流 ftp.UploadStream(originalStream); return RedirectToAction(nameof(OpenZip)); }
核心细节说明
- 使用
MemoryStream作为底层流,满足Update模式的随机访问要求。 - 初始化
ZipArchive时设置leaveOpen: true,确保释放ZipArchive时不会关闭底层的MemoryStream。 - 增加条目存在性检查,避免空引用或索引越界异常。
内容的提问来源于stack exchange,提问作者Barta
相关产品推荐
相关产品推荐

