Converting string to web-safe Base64 format

google-admin-sdk, google-apps-script

Solution

The API requires you to use URL-safe base64 encoding. After doing the base64 encoding, try replacing `/` with `_` and `+` with `-`. Details at:

https://developers.google.com/admin-sdk/directory/v1/reference/users/photos/update

Problem

I am testing how to update user picture using the Admin SDK Directory Service with Google Apps Scripts with the following function: ``` 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'); } ``` However, it doesn't always work. Whenever there is padding in the base64 encoded string, it fails. Referring to Google's document (https://developers.google.com/admin-sdk/directory/v1/reference/users/photos/update), I am a bit confused with the descriptions. It says: - The equals sign (=) character is replaced with the asterisk (*). - For padding, the period (.) character is used instead of the RFC-4648 baseURL definition which uses the equals sign (=) for padding. This is done to simplify URL-parsing. What should be actually done? (=) is used for padding in Base64. So, should I use (*) or (.)? I did try to replace (=) with (.) but no luck. Can anyone help? It is so strange. It works when i do not replace (=). ``` 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'); ``` }

Original source