Storing and serving up images from scriptDB with Google Content Service, jSonP and jQuery

Continuing the theme of using Google Apps Script Content service and scriptDB for lots of things, today’s post cover a few tricky topics.

  • How to convert an image to a blob so it can be stored in scriptDB.
  • How to use the content service as a server so that we can serve up that image to some request
  • How to respond to a jSonP request from Google Content service to get over cross domain request problems
  • How to convert that back into an image in jQuery
Why might we want to do this?
Google apps script gives you the opportunity to serve up content without actually needing a web server. Let’s say  you wanted to create some dynamic image content throug some scheduled event, but had nowhere to serve it up from? ScriptDB could be a good repository for such data, and Google Apps Script could serve it up
Loading image into scriptDB
Firstly, let’s take a look at loading an image into scriptDB. I’m going to use the silo functions to minimize development for this. These can be included in your project from the mcpher script library.
function blob() {
 var googleLogoBlob = UrlFetchApp.fetch
(“http://www.google.com/intl/en_com/images/srpr/logo3w.png”)
.getBlob().setName(“googleLogoBlob”);
 var silo = mcpher.scriptDbSilo(“blobs”,ScriptDb.getMyDb());
 silo.save ( {name: googleLogoBlob.getName(), 
                   blob: Utilities.base64Encode(googleLogoBlob.getBytes()) } );
}
Here we fetch some image, name it ‘googleLogoBlob’, convert it to base64 and save as a blob in a scriptDB silo called ‘blobs’.
Publishing as a web application
Next we need to publish a doGet(e) function that will be able to publish a jSon encoded version of that blob.
function doGet(e) {
    return ContentService
            .createTextOutput(blobGet(e))
              .setMimeType(ContentService.MimeType.JSON);  
}
The result of that is shared here, and the function that does the work , takes the name parameter, and callback parameter to handle jSonP requests.
function blobGet(e) {
  // imgs are in base64 format in scriptDB
  var stuffSilo = mcpher.scriptDbSilo(“blobs”,ScriptDb.getMyDb());
  var results = stuffSilo.query( {name : e.parameter.name});
  // find it?
  var result= results.hasNext() ? results.next() : { error: “no such blob ” + e.parameter.name};
  var j = Utilities.jsonStringify(result);
  // using jsonP?
  if (e.parameter.callback) {
      j = e.parameter.callback + “(” + j + “)”
  }
  return j;
}
Note that if callback is specified (and it should be), the jSon response is wrapped up in a call to the given callback function. 
Putting it together with jQuery
Finally, here is a jQuery snippet of making that call and showing the image. You’ll can test the whole thing  with this jsfiddle, reproduced below.

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

$(document).ready(function() {
  var url =
 “https://script.google.com/a/macros/mcpher.com/s/AKfycbx37dFqzoaIdNfFZSujRr4iHEz0jKh5O_uUli6FPRjp3UEIevQY/exec”;
  var blobName = “googleLogoBlob”;
  $.getJSON(url + “?name=” + blobName + “&callback=?”, null, function(blob) {
    $(‘#blobsimage’).attr(‘src’, “data:image/png;base64,” + blob.blob);
    });
});​

(function() { var po = document.createElement(‘script’); po.type = ‘text/javascript’; po.async = true; po.src = ‘https://apis.google.com/js/plusone.js’; var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(po, s); })();

Author: bm082975

Leave a Reply

Your email address will not be published. Required fields are marked *