API Google Диска: невозможно загрузить файлы в корневую папку с помощью nodejs - PullRequest
1 голос
/ 11 октября 2019

Я использую Google Drive API для загрузки файлов. Это работает, если я укажу id подпапок. Но когда я передаю идентификатор корневой папки, файлы не загружаются. Вот мой запрос:

      drive.files.create(
    {
      auth: this.ggToken,
      fields: 'id',
      supportsAllDrives: true,
      media: {
        body: this.convertBufferToStream(file.buffer),
      },
      requestBody: {
        mimeType: file.mimetype,
        name: file.originalname,
        parents: ['root', '0AASRHiHHtzxrUk9PVA'],
      },
    },
    (e: Error, f: any) => {
      if (e) {
        console.error(e);
      }
      console.log(f);
    },
  );

0AASRHiHHtzxrUk9PVA - это идентификатор корневой папки (я получаю его с помощью API drive.files.get). Так что не так с моим кодом? Как я могу загрузить файлы в корневую папку? Спасибо.

Обновление 1 Вот мой скрипт:

      ggToken: JWT;

  constructor() {
    this.ggToken = new google.auth.JWT(
      process.env.GG_DRIVE_CLIENT_EMAIL,
      null,
      process.env.GG_DRIVE_PRIVATE_KEY,
      ['https://www.googleapis.com/auth/drive'],
      null,
    );
  }

  async uploadFiles(file: any) {
    const credentials = await this.ggToken.authorize();
    this.ggToken.setCredentials(credentials);
    const uploadedFile = await drive.files.create({
      auth: this.ggToken,
      fields:
        'id, name, mimeType, webViewLink, webContentLink, iconLink, size, originalFilename',
      media: {
        body: this.convertBufferToStream(file.buffer),
      },
      requestBody: {
        mimeType: file.mimetype,
        name: file.originalname,
        parents: ['root'],
        properties: {},
      },
    });
    return {
      driveResource: uploadedFile.data,
    };
  }

Я получил process.env.GG_DRIVE_CLIENT_EMAIL и process.env.GG_DRIVE_PRIVATE_KEY из файла json после создания сервераключ учетной записи.

1 Ответ

1 голос
/ 18 октября 2019

Большое спасибо @Tanaike. Вот его ответ:

Спасибо за ответ и добавление сценария. Я мог понять причину вашей проблемы. Сервисный аккаунт отличается от вашего собственного аккаунта. Таким образом, учетная запись службы Google Drive отличается от учетной записи вашей учетной записи. Таким образом, когда файл загружается в корневую папку с использованием вашего сценария, файл загружается в корневую папку учетной записи диска службы. При этом файл не может быть виден на диске вашей учетной записи. Если вы хотите загрузить файл в корневую папку диска вашей учетной записи, используйте OAuth2

. С помощью Oauth2 я могу загружать файлы в корневую папку. Вот мой код:

      oauth2Client: OAuth2Client;

  constructor() {
    this.oauth2Client = new google.auth.OAuth2({
      clientId: process.env.CLIENT_ID,
      clientSecret: process.env.CLIENT_SECRET,
      redirectUri: 'https://developers.google.com/oauthplayground',
    });
    this.oauth2Client.setCredentials({
      access_token: process.env.ACCESS_TOKEN,
      refresh_token: process.env.REFRESH_TOKEN,
    });
  }

  async uploadFiles(file: any) {
    const uploadedFile = await drive.files.create({
      auth: this.oauth2Client,
      fields:
        'id, name, mimeType, webViewLink, webContentLink, iconLink, size, originalFilename',
      media: {
        body: this.convertBufferToStream(file.buffer),
      },
      requestBody: {
        mimeType: file.mimetype,
        name: file.originalname,
        parents: ['root'],
      },
    });
    return {
      driveResource: uploadedFile.data,
    };
  }
...