【问题标题】:Invalid Content Length when calling Microsoft Graph API upload endpoint in PowerShell在 PowerShell 中调用 Microsoft Graph API 上传端点时内容长度无效
【发布时间】:2021-04-19 22:20:48
【问题描述】:

更新:此问题与 pwsh 7.1 和 5.1 之间的差异有关。脚本适用于 5.1 但不适用于 7.1。可能是编码问题。我尝试将 Content-Type 设置为 'application/octet-stream; charset=utf-8' 不过没关系

我有一个 pwsh 脚本,它为我们的 CI 管道做了一些事情:

  1. 创建会话上传端点
  2. 将文件拆分为 byteArray 块
  3. 将每个块上传到上传端点

该脚本在我们所有的 AppVeyor 管道中运行良好,但现在我尝试在本地运行它(在将其添加到 Jenkins 之前进行测试),但我遇到了一个我没有预料到的错误。

上传块的函数:

function UploadFile([string] $accessToken, [string] $sourceFilePath, [string] $uploadUrl, [int] $chunkSize)
{
    $header = @{"Authorization" = "bearer $accessToken"}
            
    $fileStream = [System.IO.File]::OpenRead($sourceFilePath)

    $numberOfChunks = GetNumberOfChunks -chunkSize $chunkSize -bytes $fileStream.Length

    for ($i = 1 ; $i -le $numberOfChunks ; $i++){
   
        $filePos = $fileStream.Position

        if ($i -eq $numberOfChunks){
            $lastChunkSize = $fileStream.Length - $filePos 
                
            [byte[]]$fileChunk = New-Object byte[] $lastChunkSize 

            $bytesRead = $fileStream.Read($fileChunk, 0, $lastChunkSize);
        }
        else {        
            [byte[]]$fileChunk = New-Object byte[] $chunkSize
            $bytesRead = $fileStream.Read($fileChunk, 0, $chunkSize);
        }   

        $header["Content-Length"] = $bytesRead

        $header["Content-Range"] = "bytes $filePos-$($filePos + $bytesRead - 1)/$($fileStream.Length)"
            
        Write-Host "Uploading chunk $i of $numberOfChunks to OneDrive..."
        $uploadResult = Invoke-RestMethod -Headers $header -Method Put -Uri $uploadUrl -Body $fileChunk -SkipHeaderValidation   
    }

    $fileStream.Close
    $fileStream.Dispose

    RETURN $uploadResult
}

这里有一些调试输出,显示了变量的值和错误:

同样的方法在我们的 AppVeyor 项目中运行良好。我不知道为什么它在本地对我不起作用(Win 10 x64 和 PowerShell 7.1)。我尝试将 $bytesRead (int) 转换为字符串,但没有任何区别。想知道这可能不是数学问题,而是 Content-Length 标头选项的类型问题。任何想法表示赞赏。谢谢。

【问题讨论】:

    标签: powershell rest microsoft-graph-api


    【解决方案1】:

    Welp,原来 powershell 7 不喜欢我手动设置 Content-Length。从标题中删除它,并让 Invoke-RestMethod 自动设置 Content-Length,解决了这个问题。和以前一样,我设置的只是 Content-Range,现在我可以从我们的 linux Jenkins 盒子将块上传到 OneDrive。

    【讨论】:

    • 这里有同样的错误。去掉请求头中的 Content-Length 设置即可解决问题。感谢分享。
    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多