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

PowerShell用Multipart/form-data传超50MB压缩包到.NET Core API时files为空

问题根因

你当前的PowerShell脚本存在两个核心错误:

  • 手动拼接multipart表单时,将zip二进制字节用UTF8编码转为字符串后再嵌入请求体。zip属于二进制文件,包含大量不符合UTF8编码规则的字节,转码过程会篡改、丢失原始数据,小文件可能侥幸未触发编码异常,大文件几乎必然会破坏文件结构,导致服务端无法正常解析出files参数,最终得到null值。
  • PowerShell的Invoke-WebRequest/Invoke-RestMethod默认有最大请求体大小限制,默认阈值通常为几十MB,超过阈值的请求会被截断,同样会导致服务端解析失败。

解决方案

不要手动拼接multipart表单,直接使用.NET自带的MultipartFormDataContent类生成标准表单内容,自动处理二进制传输、边界标识、编码等逻辑,完全避免手动拼接的问题。
正确脚本如下:

# 配置参数
$uploadUrl = "替换为你的实际接口地址"
$localFilePath = "C:\Temp\filename.zip"

# 关闭上传进度条,大幅提升大文件上传速度
$ProgressPreference = 'SilentlyContinue'

try {
    # 读取文件流,不要转成字符串
    $fileStream = [System.IO.File]::OpenRead($localFilePath)
    $fileName = [System.IO.Path]::GetFileName($localFilePath)

    # 构造multipart/form-data表单
    $multipartContent = [System.Net.Http.MultipartFormDataContent]::new()
    $streamContent = [System.Net.Http.StreamContent]::new($fileStream)
    $streamContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/x-zip-compressed")
    # 第二个参数对应接口的接收参数名files,不要写错
    $multipartContent.Add($streamContent, "files", $fileName)

    # 发送请求,调整最大允许的请求大小为1GB,按需修改
    $response = Invoke-RestMethod -Uri $uploadUrl `
        -Method Post `
        -Body $multipartContent `
        -MaximumResponseContentBufferSize 1073741824

    Write-Host "上传成功,响应内容:" $response
}
catch {
    Write-Host "上传失败,错误信息:" $_
}
finally {
    # 释放文件流
    if ($null -ne $fileStream) {
        $fileStream.Dispose()
    }
}

额外检查项

  • 你接口设置的RequestSizeLimit为500MB,确保上传的文件大小不超过该阈值,如有需要可调整该参数。
  • 如果服务端部署时用了IIS、Nginx等反向代理,需要同步调整代理层的上传大小限制:
    • IIS需要在web.config中配置maxAllowedContentLength为对应阈值
    • Nginx需要配置client_max_body_size为对应阈值

内容的提问来源于stack exchange,提问作者Ralph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:09:02