Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从google drive下载动态文件_Javascript_Node.js_Express_Google Drive Api - Fatal编程技术网

Javascript 如何从google drive下载动态文件

Javascript 如何从google drive下载动态文件,javascript,node.js,express,google-drive-api,Javascript,Node.js,Express,Google Drive Api,没问题,我刚刚开始使用Google Drive API v3。当我只有fileId时,如何从google drive下载动态文件。文件可以是文件、图像、pdf或文档 我试着搜索,但找不到任何与此相关的参考或示例 这是我到目前为止所拥有的,但它只下载特定的文件扩展名 downloadFile(req, res) { const auth = new google.auth.JWT( client_email, null, private_key,

没问题,我刚刚开始使用Google Drive API v3。当我只有fileId时,如何从google drive下载动态文件。文件可以是文件、图像、pdf或文档

我试着搜索,但找不到任何与此相关的参考或示例

这是我到目前为止所拥有的,但它只下载特定的文件扩展名

downloadFile(req, res) {
    const auth = new google.auth.JWT(
       client_email,
       null,
       private_key,
      SCOPES,
    );
    const { fileId } = req.params;
    const drive = google.drive({ version: 'v3', auth});
    var dest = fs.createWriteStream('./tmp/downloads/dummy.pdf')
    
    drive.files.get({
      fileId,
      alt: 'media',
    }, { 
      responseType: 'stream' 
    }).then((driveResponse) => {
      driveResponse.data.on('end', () => {
       console.log(`downloading fileID ${fileId}`);
      })
      .on('error', (err) => {
       console.log(err);
      })
      .on('data', (d) => {
        console.log(d);
      })
      .pipe(dest)
    })
    .catch((err) => {
      console.log(err);
    })
  }

有没有办法从google drive下载动态文件?

我相信您的目标如下

  • 您想使用服务帐户和文件ID从Google Drive下载文件
  • 这些文件包括谷歌文档文件和除谷歌文档文件以外的其他文件
  • 您希望使用googleapis for Node.js实现这一点
修改点:
  • 不幸的是,从
    只能下载特定的文件扩展名。
    ,我无法了解您的详细情况。但我想你的问题可能是因为下载了谷歌文档文件和除谷歌文档文件以外的其他文件
  • 下载Google Docs文件时,需要使用驱动API中的“文件:导出”方法下载文件
  • 在下载Google Docs文件以外的文件时,需要使用驱动API中的“files:get”方法下载文件
  • 我认为上述情况可能是你问题的原因
  • 为了下载googledocs文件和googledocs文件以外的文件,我提出以下流程。
  • 检查文件ID的mimeType
  • 通过mimeType使用每个方法下载文件
当上述各点反映到脚本中时,它将变成如下所示

修改脚本: 发件人: 致: 注:
  • 在这次修改中,我在
    convertMimeTypes
    准备了3种类型的Google文档文件。当您想下载其他mimeTypes时,请修改
    convertMimeTypes
    。例如,在本例中,Google文档文件作为Microsoft文档文件下载
参考资料:

您以前能搜索文件吗?去接分机?
var dest = fs.createWriteStream('./tmp/downloads/dummy.pdf')

drive.files.get({
  fileId,
  alt: 'media',
}, { 
  responseType: 'stream' 
}).then((driveResponse) => {
  driveResponse.data.on('end', () => {
   console.log(`downloading fileID ${fileId}`);
  })
  .on('error', (err) => {
   console.log(err);
  })
  .on('data', (d) => {
    console.log(d);
  })
  .pipe(dest)
})
.catch((err) => {
  console.log(err);
})
drive.files.get({ fileId, fields: "*" }, async (err, { data }) => {
  if (err) {
    console.log(err);
    return;
  }
  let filename = data.name;
  const mimeType = data.mimeType;
  let res;
  if (mimeType.includes("application/vnd.google-apps")) {
    const convertMimeTypes = {
      "application/vnd.google-apps.document": {
        type:
          "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        ext: ".docx",
      },
      "application/vnd.google-apps.spreadsheet": {
        type:
          "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        ext: ".xlsx",
      },
      "application/vnd.google-apps.presentation": {
        type:
          "application/vnd.openxmlformats-officedocument.presentationml.presentation",
        ext: ".pptx",
      },
    };
    filename += convertMimeTypes[mimeType].ext;
    res = await drive.files.export(
      {
        fileId,
        mimeType: convertMimeTypes[mimeType].type,
      },
      { responseType: "stream" }
    );
  } else {
    res = await drive.files.get(
      {
        fileId,
        alt: "media",
      },
      { responseType: "stream" }
    );
  }
  const dest = fs.createWriteStream(filename);
  res.data
    .on("end", () => console.log("Done."))
    .on("error", (err) => {
      console.log(err);
      return process.exit();
    })
    .pipe(dest);
});