如何使用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
相关产品推荐
相关产品推荐

