我使用以下代码通过 Powershell 将照片和视频上传到 Google 相册。该代码适用于图片,但在上传视频时会失败(通过浏览器上传视频时,Google 相册会接受该视频)。
尝试上传视频时,原始字节上传将成功,但 mediaItems.batchCreate
将失败,并显示 status.code 3
和 status.message “失败:尝试创建此媒体项目时出错。”
这可能是由于 header 中的 MIME 类型错误造成的吗?
Function GP-UploadMedia (){
<#
.SYNOPSIS
Uploads a Google Photos media (picture/video)
.Description
Parameters:
- album id
- media path
Returns:
- picture id
#>
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]$album_id,
[Parameter(Mandatory=$true)]
[string]$media_path
)
# refresh tokens if required
G-RefreshTokens
# 1st step: upload raw bytes
$requestUri = "https://photoslibrary.googleapis.com/v1/uploads"
$mime_type = [System.Web.MimeMapping]::GetMimeMapping($media_path);
$Headers = @{
Authorization = "Bearer $($Global:Tokens.access_token)";
ContentType = "application/octet-stream";
"X-Goog-Upload-Content-Type" = $mime_type;
"X-Goog-Upload-Protocol" = "raw";
}
$body = $media_path;
try {
$upload_token = Invoke-RestMethod -Headers $Headers -InFile $body -Uri $requestUri -Method POST
}
catch {
# Something went wrong. Investigate!
dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
}
# refresh tokens if required
G-RefreshTokens
# 2nd step: pair raw bytes to Google Photo media (picture/video)
$requestUri = "https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate"
$Headers = @{
Authorization = "Bearer $($Global:Tokens.access_token)";
}
$body = [PSCustomObject]@{
albumId = $album_id;
newMediaItems = @(
[PSCustomObject]@{
description = "";
simpleMediaItem = [PSCustomObject]@{
fileName = (Split-Path $media_path -leaf);
uploadToken = $upload_token;
}
}
)
}
$myJson = $body|ConvertTo-Json -Depth 4
try {
$Response = Invoke-RestMethod -Headers $Headers -Body ($myJson) -Uri $requestUri -Method POST -ContentType "application/json; charset=utf-8";
}
catch {
# Something went wrong. Investigate!
dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
}
return $Response.newMediaItemResults.MediaItem.id;
}
最佳答案
虽然我不确定这是否是您问题的直接解决方案,但是当您的脚本修改如下时,这是否是您问题的直接解决方案?此时,请修改“第一步:上传原始字节”的请求头,如下所示。
来自:
ContentType = "application/octet-stream";
致:
"Content-Type" = "application/octet-stream";
注意:
- 当我测试您的脚本时,我可以与您复制相同的情况。而且,当我通过上述修改修改您的脚本时,我可以确认问题可以得到解决。因此,请测试以上修改。
关于powershell - 使用 Powershell 将视频上传到 Google Photos 时出现错误 3(适用于图片),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70488403/