4

I'm wondering if it is possible to track the progress of a file upload to google cloud storage when using the javascript client? As I have a progress bar that I would like to show to the user on how much of the file has been uploaded so far.

I'm using the same upload code that google gives on their example page for file upload.

camelCaseD
  • 2,483
  • 5
  • 29
  • 44

1 Answers1

5

Instead of using the gapi.client.request api provided by the js library I instead created an XMLHttpRequest and appended a event listener for the event progress. As seen by the following:

      const boundary = '-------314159265358979323846';
      const delimiter = "\r\n--" + boundary + "\r\n";
      const close_delim = "\r\n--" + boundary + "--";

      var reader = new FileReader();
      reader.readAsBinaryString(fileData);
      reader.onload = function(e) {
        var contentType = fileData.type || 'application/octet-stream';
        var metadata = {
          'name': 'testing',
          'mimeType': contentType
        };

        var base64Data = btoa(reader.result);
        var multipartRequestBody =
          delimiter +
          'Content-Type: application/json\r\n\r\n' +
          JSON.stringify(metadata) +
          delimiter +
          'Content-Type: ' + contentType + '\r\n' +
          'Content-Transfer-Encoding: base64\r\n' +
          '\r\n' +
          base64Data +
          close_delim;

        gapi.client.request()
        var xhr = new XMLHttpRequest();

        xhr.open('POST', 'https://www.googleapis.com/upload/storage/v1/b/bucket/o?uploadType=multipart&key=apiKey&alt=json', true);

        xhr.setRequestHeader('Content-Type', 'multipart/mixed; boundary="' + boundary + '"');
        xhr.setRequestHeader('authorization', 'Bearer ' + gapi.auth.getToken().access_token);

        xhr.upload.addEventListener("progress", function(e) {
          var pc = parseFloat(e.loaded / e.total * 100).toFixed(2);
        }, false);

        xhr.onreadystatechange = function(e) {
          if (xhr.readyState == 4) {
            console.log(xhr.responseText);
          }
        };

        xhr.send(multipartRequestBody);

Attribution: Majority of code was taken from Google's js library with the only addition being the event listener for listening to the progress of the upload.

camelCaseD
  • 2,483
  • 5
  • 29
  • 44