使用Powershell将附件上传到Google协作平台(Invoke-RestMethod)

时间:2014-05-29 05:53:26

标签: powershell google-api powershell-v3.0 google-sites

我需要从Powershell将文件上传到我的Google协作平台网站。

我已经让OAuth部分正常运行,以及其他一些API函数,但我无法解决如何以这种方式上传二进制数据的问题。

基于this page,这是我写的函数:

Function UploadFileToGoogleSites {
    param(
        [Parameter(Mandatory=$true)] $OAuth2ServiceAccountToken,
        [Parameter(Mandatory=$true)] $Domain,
        [Parameter(Mandatory=$true)] $SiteName,
        $ParentEntryID = '',
        [Parameter(Mandatory=$true)] $FilePath,
        $FileName = '',
        [Parameter(Mandatory=$true)] $FileType
    )

    if ( $FileName -eq '' ) {
        $FileName = [System.IO.Path]::GetFileName($FilePath)
    }

    $requestUri = "https://sites.google.com/feeds/content/$($Domain)/$($SiteName)"

    $requestHeaders = @{ Authorization = $OAuth2ServiceAccountToken; 'GData-Version' = 1.4 }

    $requestContentType = 'multipart/related; boundary=_BOUNDARY_'

    $requestBody = @"
    --_BOUNDARY_
    Content-Type: application/atom+xml

    <?xml version="1.0" encoding="utf-8"?>
    <atom:entry xmlns:atom="http://www.w3.org/2005/Atom">
        <atom:category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/sites/2008#attachment" label="attachment" />
        <link rel="http://schemas.google.com/sites/2008#parent" type="application/atom+xml" href="https://sites.google.com/feeds/content/$($Domain)/$($SiteName)/$($ParentEntryID)" />
        <atom:title>$($FileName)</atom:title>
    </atom:entry>

    --_BOUNDARY_
    Content-Type: $($FileType)
    Content-Transfer-Encoding: base64

    $([System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes($FilePath)))

    --_BOUNDARY_--
    "@

    Invoke-RestMethod -Method Post -Uri $requestUri -Headers $requestHeaders -ContentType $requestContentType -Body $requestBody
}

然后这样调用:

UploadFileToGoogleSites -OAuth2ServiceAccountToken $oAuth2ServiceAccountToken -Domain $domain -SiteName $siteName -FilePath 'C:\temp\image.png -FileType 'image/png'

Google协作平台似乎无法识别二进制数据的Base64编码 - 上传简单的文本文件会导致在Google网站中成功创建文本文件,但内容是Base64数据,而不是原始文本。< / p>

对于二进制类型也是如此,例如上传PNG图像文件(带有-FileType 'image/png')导致创建的PNG文件实际上只是一个文本文件,其中base64数据作为内容,但是PNG扩展名。

显然,删除Base64编码步骤(即用$([System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes($FilePath)))替换$(Get-Content $FilePath))将适用于文本文件,文件正确创建,但这不仅会导致不兼容字符出现问题,而且不适用于二进制文件(在这种情况下,这是真正需要的)。

有人对如何使用Powershell将附件上传到Google协作平台有任何建议吗?

0 个答案:

没有答案