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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:48:17