What works
To download the binary blob, use github / googleapi cors-upload-sample or use my built-in fork, UploaderForGoogleDrive , which will select the access_token from the gapi client for you.
Here is an ugly mix of Promise code and callback that works for me. As a prerequisite, gapi , UploaderForGoogleDrive , JSZip must be loaded using <script> tags. The snippet also excludes gallis initialization and API secrets, which are also necessary.
function bigCSV(){ // makes a string for a 300k row CSV file const rows = new Array(300*1000).fill('').map((v,j)=>{ return [j,2*j,j*j,Math.random(),Math.random()].join(','); }); return rows.join("\n"); } function bigZip(){ // makes a ZIP file blob, about 8MB const zip = new window.JSZip(); zip.folder("A").file("big.csv", bigCSV()); return zip.generateAsync({type:"blob", compression:"DEFLATE"}); // returns Promise<blob> } function upload2(zipcontent){ 'use strict'; const parent = 'root'; const spaces = 'drive'; const metadata = { name: 'testUpload2H.zip', mimeType: 'application/zip', parents: [parent] }; const uploader = new window.UploaderForGoogleDrive({ file: zipcontent, metadata: metadata, params: { spaces, fields: 'id,name,mimeType,md5Checksum,size' }, onProgress: function(x){ console.log("upload progress:",Math.floor(100*x.loaded/x.total)); }, onComplete: function(x){ if (typeof(x)==='string') x = JSON.parse(x); // do something with the file metadata in x console.log("upload complete: "); }, onError: function(e){ console.log("upload error: ",e); } }); uploader.upload(); } function uploadZipFile(){ 'use strict'; (bigZip() .then(upload2) ); }
What does not work
As of November 2017, loading a binary block with a call to gapi.client.request will not work, due to a problem where gapi removes the PUT payload
I also tried using base64 with gapi , which works. but embeds base64 files, not real binary files; and a cors mode select API that partially handled but created CORS related errors and hiding the answer, at least for me.