Chrome/Edge中input file仅返文件名时如何读取上传zip内容
核心说明
现代浏览器(Chrome、Edge、Firefox等)均不会通过<input type="file">返回用户本地文件的完整路径,这是通用的Web安全规范,目的是避免网站窃取用户本地文件系统结构信息。
你完全不需要获取该本地路径:文件上传时,浏览器会将选中文件的完整二进制内容封装在multipart/form-data格式的请求体中发送到后端,你只需要在ASP.NET Core中直接读取请求携带的文件流即可完成zip包解析,无需依赖客户端本地路径。
第一步:修正前端表单
你当前使用的表单缺少文件上传必需的enctype属性,未配置该属性时浏览器不会发送文件内容,仅会提交文件名字符串,修正后的表单代码如下:
<form method="post" enctype="multipart/form-data"> <input type="file" name="varName" accept=".zip"> <input type="submit" value="上传解析"> </form>
新增的accept=".zip"属性可在前端文件选择框默认过滤zip格式文件,减少无效上传。
第二步:后端解析实现
.NET 5+ 内置了System.IO.Compression库可直接读取zip流,无需安装第三方依赖,也不需要先将上传文件保存到服务器磁盘,可以直接在内存中完成遍历读取。
注意后端接收文件的参数名必须和前端input的name属性值完全一致,此处为varName,类型使用IFormFile。
以下是Razor Pages场景的处理代码,MVC控制器场景逻辑完全一致,仅需将代码写入对应Action方法即可:
using System.IO.Compression; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Http; public class ZipUploadModel : PageModel { public IActionResult OnPost(IFormFile varName) { // 基础校验 if (varName == null || varName.Length == 0) { ModelState.AddModelError(string.Empty, "请选择要上传的zip文件"); return Page(); } if (Path.GetExtension(varName.FileName).ToLowerInvariant() != ".zip") { ModelState.AddModelError(string.Empty, "仅支持上传zip格式文件"); return Page(); } // 直接读取上传流解析zip using (var uploadStream = varName.OpenReadStream()) using (var zipArchive = new ZipArchive(uploadStream, ZipArchiveMode.Read, leaveOpen: false)) { // 遍历压缩包内所有条目 foreach (var entry in zipArchive.Entries) { // 跳过目录条目(目录条目无文件名,长度为0) if (string.IsNullOrWhiteSpace(entry.Name)) continue; // 读取单个文件的内容,按需处理 using (var entryStream = entry.Open()) using (var reader = new StreamReader(entryStream)) { // 示例:获取压缩包内文件的相对路径、大小 var innerFilePath = entry.FullName; var fileSize = entry.Length; // 如果是文本文件可直接读取内容,二进制文件可读取为字节数组 // var textContent = reader.ReadToEnd(); // 此处编写你的自定义业务逻辑即可 } } } return RedirectToPage("UploadSuccess"); } }
常见配置注意事项
- ASP.NET Core 默认对上传请求体的大小限制约为28MB,如果需要上传更大的zip包,可在Program.cs中添加如下配置调整限制:
builder.Services.Configure<FormOptions>(options => { // 示例:调整最大上传限制为100MB,可根据业务需求修改 options.MultipartBodyLengthLimit = 100 * 1024 * 1024; });
- 如果需要将压缩包内的文件保存到服务器磁盘,不要直接使用
entry.FullName拼接服务器路径,需自行做路径遍历校验,防止恶意构造的zip包写入服务器系统目录。 - 仅校验文件扩展名不足以确认文件是合法zip包,
ZipArchive初始化时如果流不是合法zip格式会直接抛出异常,生产环境建议加try-catch捕获对应异常返回友好提示。
内容的提问来源于stack exchange,提问作者Temp Account
相关产品推荐
相关产品推荐

