javascript - 将文件上传到状态 200 的 Google Drive API,但该文件在哪里?

标签 javascript node.js google-drive-api

我正在尝试将文件上传到 Google 云端硬盘。运行该程序后,我得到状态 200,但在云端硬盘中找不到该文件。 我在 parents 键下的 fileMetadata 变量中输入了文件夹 ID。

这是我的代码:

const { google } = require('googleapis');
const credentials = require('./credentials.json');
const fs = require('fs')

const scopes = [
    'https://www.googleapis.com/auth/drive',
    'https://www.googleapis.com/auth/drive.file',
    'https://www.googleapis.com/auth/drive.appdata',
  ];

const auth = new google.auth.JWT(
credentials.client_email, null,
credentials.private_key, scopes
);

const drive = google.drive({ version: "v3", auth });

auth.authorize(function(err, tokens) {
    if (err) {
        console.log(err);
        return;                                                     
    } else {
        console.log('It authorized successfully!');
        console.log(`The Token is: ${JSON.stringify(tokens)}`)
        var data = fs.createReadStream('./Test.txt')
        var fileMetadata = {
            'name': 'photo.txt',
            'parents':[{'id':'1MiFB-XXWFRHjxZwTmE9FxsCGb9Een_2Y'}] //Folder ID
          };
          var media = {
            mimeType: 'text/plain',
            body: data //
          };
          drive.files.create({
             resource: fileMetadata,
             media: media,
             fields: 'id'
          }).then (function(err, file) {
            if(err) {
              // Handle error
              console.log(err);
            } else {
              console.log('File Id: ', file.id);
            }
          });
    }
});

这就是我得到的回复:

{
  config: {
    url: 'https://www.googleapis.com/upload/drive/v3/files?fields=id&uploadType=multipart',
    method: 'POST',
    paramsSerializer: [Function (anonymous)],
    data: PassThrough {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: true,
      _flush: [Function: flush],
      [Symbol(kCapture)]: false,
      [Symbol(kTransformState)]: [Object]
    },
    headers: {
      'Content-Type': 'multipart/related; boundary=7b25465c-4ee3-450d-b41c-7efd51e4637d',
      'Accept-Encoding': 'gzip',
      'User-Agent': 'google-api-nodejs-client/0.7.2 (gzip)',
      Authorization: 'Bearer `TOKEN`,
      Accept: 'application/json'
    },
    params: [Object: null prototype] { fields: 'id', uploadType: 'multipart' },
    validateStatus: [Function (anonymous)],
    body: PassThrough {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: true,
      _flush: [Function: flush],
      [Symbol(kCapture)]: false,
      [Symbol(kTransformState)]: [Object]
    },
    responseType: 'json'
  },
  data: { id: '1up-LCc9Fc0D2_t7OdJvF9D2QEVwxhV8y' },
  headers: {
    'alt-svc': 'h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"',
    'cache-control': 'no-cache, no-store, max-age=0, must-revalidate',
    connection: 'close',
    'content-length': '47',
    'content-type': 'application/json; charset=UTF-8',
    date: 'Mon, 27 Jul 2020 09:54:42 GMT',
    expires: 'Mon, 01 Jan 1990 00:00:00 GMT',
    pragma: 'no-cache',
    server: 'UploadServer',
    vary: 'Origin, X-Origin',
    'x-guploader-uploadid': 'AAANsUma96bf0mAHkz32b8QuarZvQBuez_rVwOmhVV-ESgd1IccLyYYnn3xdT--jVFDdo9zC9Qz_VqAVyaHK-OcQWFA'
  },
  status: 200,
  statusText: 'OK'
}

文件在哪里? 这里有什么不对吗?

谢谢!!

最佳答案

我相信您的目标和情况如下。

  • 您想要使用服务帐户将文件上传到 Google 云端硬盘。
  • 您已经能够使用 Drive API 和适用于 Node.js 的 googleapis 来上传文件。

修改点:

来自 After I run the program, I get status 200 but I can't find the file in Drive.以及脚本中的服务帐户,我认为问题的原因是上传的文件被放入服务帐户的Google Drive中。

该服务帐户与您的 Google 帐户不同。因此,当服务帐户上传文件时,该文件将被放入服务帐户的 Google Drive 中。这样,您就无法使用浏览器查看 Google 云端硬盘上的文件。

因此,为了在您的 Google 云端硬盘上查看服务帐户上传的文件,我建议采用以下 2 种模式。

模式 1:

在此模式中,文件将上传到 Google 云端硬盘中的文件夹。由此,请执行以下流程。

  1. 在您的 Google 云端硬盘中创建一个文件夹。
  2. 将创建的文件夹共享到服务帐户的电子邮件。
    • 您可以在服务帐户的凭据文件中看到服务帐户的电子邮件。
  3. 使用服务帐户将文件上传到共享文件夹。

通过此流程,您可以在 Google 云端硬盘的共享文件夹中看到上传的文件。

但是,在您的脚本中,需要进行一些修改。

修改后的脚本:

从:
var fileMetadata = {
    'name': 'photo.txt',
    'parents':[{'id':'1MiFB-XXWFRHjxZwTmE9FxsCGb9Een_2Y'}] //Folder ID
  };
  var media = {
    mimeType: 'text/plain',
    body: data //
  };
drive.files.create({
   resource: fileMetadata,
   media: media,
   fields: 'id'
}).then (function(err, file) {
  if(err) {
    // Handle error
    console.log(err);
  } else {
    console.log('File Id: ', file.id);
  }
});
到:
var fileMetadata = {
    'name': 'photo.txt',
    'parents':['### folderId of the folder shared with the service account ###'}] //Folder ID
  };
  var media = {
    mimeType: 'text/plain',
    body: data //
  };
drive.files
  .create({
    resource: fileMetadata,
    media: media,
    fields: "id",
  })
  .then(function (file) {
    const fileId = file.data.id;
    console.log("File Id: ", fileId);
  })
  .catch(function (err) {
    console.log(err);
  });

模式 2:

在此模式中,文件将上传到服务帐户的 Google 云端硬盘,并为您的 Google 帐户创建该文件的权限。这样,您就可以在“与我共享”中看到上传的文件。

修改后的脚本:

从:
var fileMetadata = {
    'name': 'photo.txt',
    'parents':[{'id':'1MiFB-XXWFRHjxZwTmE9FxsCGb9Een_2Y'}] //Folder ID
  };
  var media = {
    mimeType: 'text/plain',
    body: data //
  };
drive.files.create({
   resource: fileMetadata,
   media: media,
   fields: 'id'
}).then (function(err, file) {
  if(err) {
    // Handle error
    console.log(err);
  } else {
    console.log('File Id: ', file.id);
  }
});
到:
var fileMetadata = {
    'name': 'photo.txt',
  };
  var media = {
    mimeType: 'text/plain',
    body: data //
  };
drive.files
  .create({
    resource: fileMetadata,
    media: media,
    fields: "id",
  })
  .then(function (file) {
    const fileId = file.data.id;
    console.log("File Id: ", fileId);
    drive.permissions.create(
      {
        resource: {
          type: "user",
          role: "writer",
          emailAddress: "###",  // <--- Please set the email of your Google account.
        },
        fileId: fileId,
        fields: "id",
      },
      function (err, res) {
        if (err) {
          console.log(err);
          return;
        }
        console.log(res.data);
      }
    );
  })
  .catch(function (err) {
    console.log(err);
  });
  • 在这种情况下,服务帐户上传的文件(Google 文档文件除外)的所有者尚无法更改。但我相信当You can't yet change the owner of this item. (We're working on it.)的错误信息出现时可见,这将在以后的更新中实现。

注意:

  • 我可以确认上述修改后的脚本适用于 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="61060e0e060d04001108122154574f514f51" rel="noreferrer noopener nofollow">[email protected]</a> .

引用文献:

关于javascript - 将文件上传到状态 200 的 Google Drive API,但该文件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63113116/

相关文章:

javascript - 基于时间的特定背景

javascript - 有没有办法在对象创建时通过字符串命名属性?

javascript - 设置 innerhtml 时出现 IE 未知运行时错误

JavaScript - 类型错误 : listener must be a function

node.js - 在 Express 3.0 中捕获和跟踪中间件异常(less-middleware)

node.js - 无法从另一个模块设置express.static

google-drive-api - gapi.drive.share.ShareClient 多个用户登录时为 false

javascript - 删除 JavaScript 中的元素

c# - 谷歌云端硬盘 API v2 : InsertMediaUpload - Null response received

c# - 如何在 Google Drive API 中取消上传?