我需要从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协作平台有任何建议吗?