Abir Taheer
Abir Taheer

Reputation: 2783

Google Drive API Not Writing Body To File

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.

Upvotes: 0

Views: 758

Answers (2)

Mario Varchmin
Mario Varchmin

Reputation: 3782

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' });

Upvotes: 2

Linda Lawton - DaImTo
Linda Lawton - DaImTo

Reputation: 117016

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.

Upvotes: 0

Related Questions