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为对应阈值
- IIS需要在web.config中配置
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

