powershell - 使用 Powershell 将视频上传到 Google Photos 时出现错误 3(适用于图片)

标签 powershell rest google-photos-api

我使用以下代码通过 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/

相关文章:

python - CherryPy 和 RESTful 网络 API

visual-studio - 添加 "REST API Client..."菜单不可用

node.js - 我使用 express for node.js 得到冒号和我的参数

powershell - 如何重新组织 powershell 的比较对象输出?

bash - 是否可以将变量从 BASH 脚本传递到 Linux 上的 PWSH

java - Google 图书馆照片 API

google-photos - Google 相册 API 限制

java - com.google.auth.oauth2.GoogleCredentials.createScoped 处出现 StackOverflowError(GoogleCredentials.java :222)

powershell - 为什么驱动器根目录上的Set-Acl尝试设置 “object”的所有权?

powershell - PowerShell中的grep gci输出