PowerShell上传SharePoint文件时提示ContentType无效报错如何解决
问题修复方案
这个报错是PowerShell Invoke-RestMethod 内置的请求头校验逻辑导致的,和你手动设置的Header值无关:
- 当你把
Content-Type放在自定义Headers字典中时,新版PowerShell(尤其是5.1之后的版本)会优先校验-ContentType参数是否存在,认为你不应该直接在Headers里传这个字段,触发误判 - 你当前用
Get-Content直接读取zip二进制文件没有指定字节编码,会破坏zip文件结构,也是潜在的故障点
方案1:调整参数传递规则(推荐,不需要跳过校验)
- 把
Content-Type从自定义Headers字典中移除,改用Invoke-RestMethod自带的-ContentType参数传递 - 读取二进制文件时增加字节编码参数,或者直接使用
-InFile参数让PowerShell自动处理文件读取和请求头计算 - 不需要手动设置
Content-Length头,PowerShell会自动根据文件大小生成,避免手动计算出错
修正后的代码示例:
$fileSize = (Get-Item -LiteralPath $file).length write-host "*******" write-host $file write-host $fileSize write-host "*******" $uploadURLObject = GET-UPLOADLINK -clientId $clientId -clientSecret $clientSecret -nameofFile $nameWithoutExtension $tokenObject = GET-TOKEN -clientId $clientId -clientSecret $clientSecret $uploadHeaders = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" # 移除Headers里的Content-Type $uploadHeaders.Add("Content-Range", "bytes " + 0 +"-" + ($fileSize-1) + "/" + $fileSize) $uploadHeaders.Add("Authorization", "Bearer "+ $tokenObject.access_token) # 直接用-InFile参数传递文件,无需手动读文件 $response = Invoke-RestMethod $uploadURLObject.uploadUrl -Method 'PUT' -Headers $uploadHeaders -ContentType "application/zip" -Infile $file $response | ConvertTo-Json
方案2:跳过请求头校验(快速适配)
如果不想调整现有Header结构,直接在Invoke-RestMethod后加上-SkipHeaderValidation参数即可,你之前注释掉的代码本身就是正确的,直接启用就行:
# 直接启用你之前注释的代码即可 $response = Invoke-RestMethod $uploadURLObject.uploadUrl -Method 'PUT' -Headers $uploadHeaders -Infile $file -SkipHeaderValidation
额外注意事项
不要用默认参数的Get-Content读取二进制压缩包,默认配置会按文本编码解析文件,破坏二进制结构,之前运行正常属于巧合,一旦文件中出现特殊编码字符就会上传失败。
内容的提问来源于stack exchange,提问作者ZZZSharePoint
相关产品推荐
相关产品推荐

