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

如何将修改后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:05:04