【发布时间】: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 管道做了一些事情:
- 创建会话上传端点
- 将文件拆分为 byteArray 块
- 将每个块上传到上传端点
该脚本在我们所有的 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