Google Drive API 创建 0 字节文件

问题描述 投票:0回答:1

我正在尝试使用 Google GDrive API 创建文件,使用以下 Node.js 示例(来自执行分段上传部分下的文档):

/**
 * Insert new file.
 * @return{obj} file Id
 * */
async function uploadBasic() {
  const fs = require('fs');
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const requestBody = {
    name: 'photo.jpg',
    fields: 'id',
  };
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };
  try {
    const file = await service.files.create({
      requestBody,
      media: media,
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

这是我正在使用的适合我的项目的实际代码:

public async uploadToFolder(parentFolderId: string) {
    try {
        const requestBody = {
            fields: 'id',
            name: 'cat.jpg',
            parents: [parentFolderId],
        };
        const media = {
            mimeType: 'image/jpeg',
            body: fs.createReadStream(
                path.join('/Users/john/Documents/cat.jpg'),
            ),
        };
        await this.drive.files.create({
            auth: this.jwtCreds,
            supportsAllDrives: true,
            requestBody: requestBody,
            media: media,
        });

    } catch (err) {
        this.logger.error(
            `Error uploading '${fileName}' to folder ${parentFolderId}: ${err}`,
        );
        throw err;
    }
}

我在身份验证时使用范围

['https://www.googleapis.com/auth/drive']

文件在预期共享驱动器的预期父目录中创建,具有正确的文件名和正确的文件类型,但文件大小为 0 字节。

我尝试将

ReadStream
类型的数据从
fs.createReadStream
传递到
media.body
,这会生成一个长度为0字节的创建文件。

我尝试将

Buffer
类型的数据从
fs.readFileSync
传递到
media.body
,这会产生一个长度为0字节的创建文件或一个双倍长度的文件,具体取决于我如何管理缓冲区。

我尝试将 Base64 编码的字符串传递到

media.body
中,这只会生成一个包含编码字符串的创建文件。

我尝试将纯文本传递到

media.body
,这会生成一个包含纯文本的创建文件;似乎按预期工作。

我尝试使用上面的方法创建一个文件夹,它会生成一个创建的文件夹;似乎按预期工作。

javascript node.js google-api google-drive-api google-api-nodejs-client
1个回答
0
投票

显然,如果我们像这样在

update
之后进行后续
create
调用,它会起作用:

const requestBody = {
    fields: 'id',
    name: 'cat.jpg',
    parents: [parentFolderId],
};

const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream(
        path.join('/Users/john/Documents/cat.jpg'),
    ),
};

const file = await this.drive.files.create({
    auth: this.jwtCreds,
    supportsAllDrives: true,
    uploadType: 'media',
    requestBody: requestBody,
    media: media,
});

const response = await this.drive.files.update({
    auth: this.jwtCreds,
    fileId: file.data.id,
    media: {
        mimeType: 'image/png',
        body: fileData,
    },
    supportsAllDrives: true,
    uploadType: 'multipart',
});
© www.soinside.com 2019 - 2024. All rights reserved.