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

如何使用C#解压IFormFile类型的zip文件并提取内部指定文件

处理IFormFile类型ZIP压缩包的实现方案

你可以直接使用.NET内置的System.IO.Compression命名空间实现需求,无需额外安装第三方NuGet包,.NET Core 3.0及以上版本均默认支持,完整实现流程如下:


核心实现代码(Controller层示例)

using System.IO.Compression;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class UploadController : ControllerBase
{
    [HttpPost("process-zip")]
    public async Task<IActionResult> ProcessZip(IFormFile? zipFile)
    {
        // 1. 基础合法性校验
        if (zipFile == null || zipFile.Length == 0)
        {
            return BadRequest("上传的ZIP文件不能为空");
        }
        if (Path.GetExtension(zipFile.FileName).ToLower() != ".zip" 
            || zipFile.ContentType != "application/zip")
        {
            return BadRequest("仅支持上传ZIP格式的压缩文件");
        }

        // 替换为你需要提取的目标文件路径,支持子目录匹配,如 "config/appsettings.json"
        const string targetFilePath = "target.txt";
        string? targetContent = null;

        // 2. 流式读取压缩包,避免大文件占用过多内存
        using var zipStream = zipFile.OpenReadStream();
        using var archive = new ZipArchive(zipStream, ZipArchiveMode.Read);

        // 3. 匹配目标内部文件
        // 用FullName匹配带相对路径的完整文件名,用Name仅匹配不带路径的文件名
        var targetEntry = archive.Entries
            .FirstOrDefault(e => e.FullName.Equals(targetFilePath, StringComparison.OrdinalIgnoreCase));
        
        if (targetEntry == null)
        {
            return NotFound("压缩包内未找到指定的目标文件");
        }

        // 4. 读取目标文件内容,也可直接写入本地磁盘
        using var entryStream = targetEntry.Open();
        using var reader = new StreamReader(entryStream);
        targetContent = await reader.ReadToEndAsync();

        // 若需要保存到本地,替换为以下代码:
        // var saveDir = Path.Combine(Directory.GetCurrentDirectory(), "SavedFiles");
        // Directory.CreateDirectory(saveDir);
        // var savePath = Path.Combine(saveDir, Path.GetFileName(targetEntry.Name));
        // using var fileStream = new FileStream(savePath, FileMode.Create);
        // await entryStream.CopyToAsync(fileStream);

        return Ok(new { TargetFileContent = targetContent });
    }
}

注意事项

  • 路径安全:如果需要将内部文件保存到本地磁盘,务必校验targetEntry.FullName中是否存在../等路径遍历字符,避免恶意压缩包将文件写入系统敏感目录
  • 大文件适配:若上传的压缩包体积较大,可调整ASP.NET Core的上传大小限制,全程使用流式处理无需将整个压缩包加载到内存
  • 异常处理:实际生产环境建议捕获InvalidDataException(压缩包损坏)、IOException(文件读写错误)等异常,返回友好的错误提示
  • 加密压缩包处理:内置的System.IO.Compression不支持读取带密码的压缩包,如有需求可引入SharpZipLib、DotNetZip等第三方库实现

内容的提问来源于stack exchange,提问作者Anthony Earl R. Cuartero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:18:03