PowerShell 7调用Invoke-RestMethod上传SharePoint Online遇循环错误
问题描述
尝试通过PowerShell的Invoke-RestMethod上传文件到SharePoint Online时陷入循环问题:
- 使用哈希表作为请求头部时,接口返回错误,要求请求的Content-Type为JSON类型
- 将头部转换为JSON字符串后,又出现参数绑定错误,提示无法将字符串类型转换为
System.Collections.IDictionary
相关代码
# 两种尝试的头部定义 $Header = @{"Authorization" = "Bearer $accessToken"} # 或 $Header = @{"Authorization" = "Bearer $accessToken"} | ConvertTo-Json # 上传请求 Invoke-RestMethod -Uri $Url -Headers $Header -Method Put -Infile $Path -ContentType 'multipart/form-data' -Verbose
错误信息
- 使用哈希表头部时的错误:
{
"error": {
"code": "BadRequest",
"message": "Entity only allows writes with a JSON Content-Type header.",
"innerError": {
"date": "2024-04-26T18:26:15",
"request-id": "a870d677-7903-4417-a360-6abfbd056554",
"client-request-id": "a870d677-7903-4417-a360-6abfbd056554"
}
}
}
- 使用JSON格式头部时的错误:
Cannot bind parameter 'Headers'. Cannot convert the "{ "Authorization": "Bearer eyJ0e...COMPLETE TOKEN HERE...dswWw" }" value of type "System.String" to type "System.Collections.IDictionary".
问题根源与解决方案
核心问题分析
- Headers参数类型错误:
Invoke-RestMethod的-Headers参数仅接受哈希表(IDictionary类型),将其转换为JSON字符串的操作完全错误,这是第二个错误的直接原因。 - Content-Type设置不匹配:第一个错误的核心是你设置的
multipart/form-data不符合当前调用的SharePoint API端点要求:- 如果是直接上传文件内容的PUT端点,不需要
multipart/form-data,应该使用文件对应的MIME类型(如application/vnd.openxmlformats-officedocument.wordprocessingml.document)或通用的application/octet-stream - 如果是调用需要创建文件元数据的POST端点,则需要设置
Content-Type: application/json,同时不能使用-Infile,而是用-Body传入JSON格式的元数据
- 如果是直接上传文件内容的PUT端点,不需要
正确脚本示例
假设你需要直接上传/覆盖文件内容到SharePoint文档库,正确代码如下:
# 保持Headers为哈希表,这是唯一正确的格式 $Header = @{ "Authorization" = "Bearer $accessToken" "Accept" = "application/json;odata=nometadata" # 可选,指定响应格式为简化JSON } # 确认URL为SharePoint文件上传/更新端点,示例: # 上传新文件(覆盖已有文件) $Url = "https://yourtenant.sharepoint.com/sites/yoursite/_api/web/GetFolderByServerRelativeUrl('Shared Documents')/Files/add(url='test.docx', overwrite=true)" # 或更新现有文件内容 # $Url = "https://yourtenant.sharepoint.com/sites/yoursite/_api/web/GetFileByServerRelativeUrl('Shared Documents/test.docx')/$value" # 设置正确的Content-Type,这里用通用二进制类型,也可以替换为对应文件的MIME类型 Invoke-RestMethod -Uri $Url -Headers $Header -Method Put -Infile $Path -ContentType 'application/octet-stream' -Verbose
排查建议
- 完全对齐Postman配置:打开Postman中成功的请求,查看Headers的所有键值对、请求方法、Body类型(binary还是raw JSON),将PowerShell参数逐一匹配
- 确认API端点正确性:不同的SharePoint操作对应不同的API端点,上传文件内容和创建文件元数据的端点要求完全不同,务必确保URL与操作匹配
内容的提问来源于stack exchange,提问作者Echo Train
相关产品推荐
相关产品推荐

