首页 > 解决方案 > Google Drive API 在获取文件时显示“禁止”

问题描述

出于某种原因,我想从谷歌驱动器中获取文件并在服务器上处理它。从选择器中,我获取 FileID 并将其发送到后端进行下载和处理。所以在使用googleapis下载文件时,我收到了这个错误

在此处输入图像描述

先决条件

  1. Drive API 在项目中启用
  2. Access Token有Drive的权限

我尝试过的权限

  1. https://www.googleapis.com/auth/drive.readonly
  2. https://www.googleapis.com/auth/drive.file
  3. https://www.googleapis.com/auth/drive

我正在使用的代码来自 GitHub

const tmpDir = path.resolve(path.join(os.tmpdir(), "user-sheets"));
const file = path.join(tmpDir, Date.now().toString());

let stream = fs.createWriteStream(file);
let drive = google.drive({
    version: "v3",
    auth: "MY ACCESS TOKEN",
});

drive.files
    .get(
        {
            fileId: req.body.url,
            alt: "media",
            oauth_token: "MY ACCESS TOKEN",
        },
        {
            responseType: "stream",
        }
    )
    .then((r) => {
        r.data
            .on("end", async () => {
                console.log("ended");
                stream.close();
            })
            .on("error", function (err) {
                console.log("Error during download", err);
                res.json({
                    success: false,
                    message: "Something went wrong",
                    error: err,
                });
            })
            .pipe(stream);
    })
    .catch((e) => {
        console.error(e.response);
    });

标签: node.jsgoogle-drive-apigoogle-apis-explorer

解决方案


在这个答案中,我认为有以下几点。

  • MY ACCESS TOKENofauth: "MY ACCESS TOKEN",是下载文件的有效访问令牌。
  • req.body.urloffileId: req.body.url,是不是 URL 的文件 ID。

如果我的猜测不正确,请告诉我。

当我的猜测正确时,请确认以下修改。

修改点:

  • 不幸的是,MY ACCESS TOKEN不能直接用于google.drive()and drive.files.get()

当这一点反映到您的脚本中时,它变成如下。

修改后的脚本:

从:
let drive = google.drive({
    version: "v3",
    auth: "MY ACCESS TOKEN",
});

drive.files
    .get(
        {
            fileId: req.body.url,
            alt: "media",
            oauth_token: "MY ACCESS TOKEN",
        },
        {
            responseType: "stream",
        }
    )
至:
var oauth2Client = new google.auth.OAuth2();
oauth2Client.setCredentials({access_token: "MY ACCESS TOKEN"});
const drive = google.drive({
  version: "v3",
  auth: oauth2Client,
});
drive.files
  .get(
    {
      fileId: req.body.url,  // Please use the file ID here.
      alt: "media",
    },
    { responseType: "stream" }
  )

笔记:

  • 在这种情况下,可以下载除 Google Docs 文件(Google Document、Google Spreadsheet、Google Slides 等)之外的文件。请注意这一点。

参考:


推荐阅读