0

I've been trying to create a file using the Google APIs for Browser. I reused some of the code that I used to communicate with the api from NodeJS in the past and repurposed it for the browser.

const content = "this is some content";

const fileMetadata = {
  name: "my-file.txt",
  alt: "media",
};

const media = {
  mimeType: "text/plain",
  body: content,
};

const {
  result: { id: fileId },
} = await gapi.client.drive.files.create({
  resource: fileMetadata,
  media: media,
  fields: "id",
});

I typically get a successful response saying that my file was created.

However, when I try to get the contents of the file the body field is an empty string.

const { body } = await gapi.client.drive.files.get({
  fileId: fileId,
});

console.log(body)
// ""

I think the request to create the file might not be formatted correctly but it works when it runs on the backend so I'm confused as to why it doesn't work in the browser.

Linda Lawton - DaImTo
  • 106,405
  • 32
  • 180
  • 449
Abir Taheer
  • 2,502
  • 3
  • 12
  • 34

2 Answers2

2

You are mentioning that you are using the Google APIs for browser, and not node.js.

I would recommend to send the request directly against the Google REST API, as gapi.client.drive.create() appears to have problems sending the actual binary file (while sending metadata appears to work). Look here, for example: https://stackoverflow.com/a/53841879/7821823, https://stackoverflow.com/a/35182924/7821823 or https://stackoverflow.com/a/68595887/7821823

You can send the data as a blob and create the request using the FormData class.

  async upload(blob, name, mimeType, parents = ["root"]) {
    const metadata = { name, mimeType, parents };
    const form = new FormData();
    form.append("metadata", new Blob([JSON.stringify(metadata)], { type: "application/json" }));
    form.append("file", blob);
    return fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true", {
      method: "POST",
      headers: new Headers({ Authorization: `Bearer ${gapi.auth.getToken().access_token}` }),
      body: form,
    });
  }

I have not tested if you can send a String instead of a Blob, but you can easily create a Blob from a String:

const content = "this is some content";
const blob = new Blob([content], { type: 'text/plain' });
Mario Varchmin
  • 3,704
  • 4
  • 18
  • 33
0

The body of the file should be in the form of a stream. Not plain text.

var media = {
  mimeType: 'text/plain',
  body: fs.createReadStream('files/my-file.txt')
};

as for console.log(body)

Also file.get returns a file.resource File resource does not give you the option to see the contents of the file. Google Drive doesn't have the ability to read the file itself it can only tell you about the file.

Linda Lawton - DaImTo
  • 106,405
  • 32
  • 180
  • 449