我正在测试如何使用带有Google Apps脚本的Admin SDK目录服务更新用户图片,其功能如下:
function updatePhoto(){
var fileId = 'XXXXXXXXXXXXXXXXXXX';
var b = DocsList.getFileById(fileId).getBlob();
var encoded = Utilities.base64Encode(b.getBytes());
encoded = encoded.replace(/\//g,'_').replace(/\+/g,'-').replace(/\=/g,'*');
AdminDirectory.Users.Photos.update({
"photoData": encoded },'harry.potter@abc.edu.hk');
}
然而,它并不总是有效。只要base64编码的字符串中有填充,它就会失败。参考Google的文档(https://developers.google.com/admin-sdk/directory/v1/reference/users/photos/update),我对这些描述感到有些困惑。它说:
实际应该做什么? (=)用于Base64中的填充。那么,我应该使用(*)还是(。)?我确实尝试用(。)替换(=)但没有运气。
有人可以帮忙吗?
太奇怪了。它适用于我不替换(=)。
function updatePhoto(){
var fileId = 'XXXXXXXXXXXXXXXXXXX';
var b = DocsList.getFileById(fileId).getBlob();
var encoded = Utilities.base64Encode(b.getBytes());
encoded = encoded.replace(/\//g,'_').replace(/\+/g,'-');
AdminDirectory.Users.Photos.update({
"photoData": encoded },'harry.potter@abc.edu.hk');
}
答案 0 :(得分:5)
API要求您使用URL安全的base64编码。执行base64编码后,尝试将/
替换为_
,将+
替换为-
。详细信息:
https://developers.google.com/admin-sdk/directory/v1/reference/users/photos/update
答案 1 :(得分:3)
我知道这已经很老了,但我正在做类似的工作,我想分享我的解决方案。您可以使用此函数将字符串转换为base64safeurl字符串:
protected static string Base64ForUrlEncode(string str)
{
StringBuilder result = new StringBuilder(Convert.ToBase64String(Encoding.ASCII.GetBytes(str)).TrimEnd('='));
result.Replace('+', '-');
result.Replace('/', '_');
return result.ToString();
}
此处有更多信息:http://www.codeproject.com/Tips/76650/Base-base-url-base-url-and-z-base-encoding
注意:这是C#代码,因此该解决方案适用于.NET开发。
答案 2 :(得分:0)
添加到@Jay lee&@Daniel Marin的答案:
如果您使用Python进行编码,则可以使用:
base64.urlsafe
功能,在Java中,您可以使用:
Base64.encodeBase64URLSafeString(byte[] binaryData)
答案 3 :(得分:0)
RFC 4648 指定“网络安全”base64 并将其称为“base64url”:https://datatracker.ietf.org/doc/html/rfc4648#section-5