Home > Software design >  How to upload a file from an export in Google Drive API without saving the file
How to upload a file from an export in Google Drive API without saving the file

Time:09-22

I'm exporting a file sheet file from drive and uploading it back to drive in pdf format. The problem is that in order to upload it I need to save it to file on a server first.

I've tried to read a response from drive.files.export in fs.createReadStream, but it didn't work. Is there another way?

  const res = await drive.files.export(
    { fileId, mimeType: "application/pdf" }
  );

  var media = {
    mimeType: 'application/pdf',
    body: fs.createReadStream(res) // TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string or an instance of Buffer or URL. Received an instance of Object
  };

  const resCreate = await drive.files.create({
    uploadType: "media",
    media: media,
    resource: fileMetadata,
    fields: "id"
  }, function (err, file) {...});

CodePudding user response:

I believe your goal as follows.

  • You want to export a Google Spreadsheet as the PDF data and want to upload it to Google Drive.
  • At that time, you want to achieve this without creating a file.
  • You want to achieve this using googleapis for Node.js.

In this case, how about the following modification?

Modified script:

const res = await drive.files.export(
  { fileId, mimeType: "application/pdf" },
  { responseType: "stream" }
);
var media = {
  mimeType: "application/pdf",
  body: res.data,
};
const resCreate = await drive.files.create({
  uploadType: "media",
  media: media,
  resource: fileMetadata,
  fields: "id",
});
console.log(resCreate.data.id);
  • Before you use this modified script, please set fileId and fileMetadata.
  • The exported file is retrieved the stream data with responseType: "stream". By this, the returned data can be used for media.

Reference:

  • Related