使用Invoke-RestMethod上传文件提示路径访问被拒绝
问题原因
- 你遇到的「路径访问被拒绝」是本地PowerShell抛出的文件系统错误,和你提到的服务端账号写入权限没有任何关系,服务端返回的权限错误会以HTTP响应体的形式返回,不会直接提示本地路径访问拒绝。
- 触发该错误的核心是Windows PowerShell(5.1及以下内置版本)
Invoke-RestMethod的-Infile参数存在路径解析缺陷:如果传入的是相对路径、带空格/特殊字符的路径,参数无法正确定位目标文件,甚至会错误尝试访问当前会话上下文下受系统保护的路径,直接触发本地权限拦截。你提到的「直接输入文件名可正常运行」,本质是手动输入完整绝对路径时绕开了这个解析bug。 - 额外注意:直接搭配
-Infile发送POST请求时,PowerShell默认不会将请求编码为multipart/form-data格式,就算路径问题解决,服务端也无法按文件上传规则解析请求,属于用法错误。
解决方法
- 修复本地路径问题:永远向
-Infile传入文件的完整绝对路径,不要使用相对路径。上传前可以先通过命令解析出目标文件的标准绝对路径,避免解析错误:
同时确认当前运行PowerShell的用户账号对该文件有读取权限,不要把待上传文件放在C盘根目录、Program Files等受UAC保护的系统目录下,避免触发本地权限拦截。$uploadFilePath = (Resolve-Path "你本地待上传的文件路径").Path - 显式构造标准
multipart/form-data格式请求,不要依赖-Infile的默认请求格式:
如果你用的是PowerShell 6.1及以上版本(PowerShell 7+),可以直接用原生-Form参数构造表单,写法最简单:
如果你用的是系统内置的Windows PowerShell 5.1,需要手动构造multipart表单内容对象,参考写法:$requestUri = "替换为你的上传接口地址" $uploadFilePath = (Resolve-Path "待上传文件的本地路径").Path $formData = @{ # 接口要求的其他普通表单字段按实际需求填写,例如: # remark = "测试文件上传" uploadFile = Get-Item $uploadFilePath } Invoke-RestMethod -Uri $requestUri -Method Post -Form $formData$requestUri = "替换为你的上传接口地址" $uploadFilePath = (Resolve-Path "待上传文件的本地路径").Path $fileStream = [System.IO.File]::OpenRead($uploadFilePath) $streamContent = [System.Net.Http.StreamContent]::new($fileStream) $streamContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/octet-stream") $multipartContent = [System.Net.Http.MultipartFormDataContent]::new() $multipartContent.Add($streamContent, "uploadFile", [System.IO.Path]::GetFileName($uploadFilePath)) try { Invoke-RestMethod -Uri $requestUri -Method Post -Body $multipartContent -ContentType "multipart/form-data" } finally { $fileStream.Dispose() }
内容的提问来源于stack exchange,提问作者Nnnnn
相关产品推荐
相关产品推荐

