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

PowerShell上传SharePoint文件时提示ContentType无效报错如何解决

问题修复方案

这个报错是PowerShell Invoke-RestMethod 内置的请求头校验逻辑导致的,和你手动设置的Header值无关:

  1. 当你把Content-Type放在自定义Headers字典中时,新版PowerShell(尤其是5.1之后的版本)会优先校验-ContentType参数是否存在,认为你不应该直接在Headers里传这个字段,触发误判
  2. 你当前用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:42:04