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

PowerShell 7调用Invoke-RestMethod上传SharePoint Online遇循环错误

SharePoint Online文件上传PowerShell脚本问题排查

问题描述

尝试通过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

错误信息

  1. 使用哈希表头部时的错误:

{
"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"
}
}
}

  1. 使用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".

问题根源与解决方案

核心问题分析

  1. Headers参数类型错误:Invoke-RestMethod的-Headers参数仅接受哈希表(IDictionary类型),将其转换为JSON字符串的操作完全错误,这是第二个错误的直接原因。
  2. 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格式的元数据

正确脚本示例

假设你需要直接上传/覆盖文件内容到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:27:49