我正在尝试使用 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
,这会生成一个包含纯文本的创建文件;似乎按预期工作。
我尝试使用上面的方法创建一个文件夹,它会生成一个创建的文件夹;似乎按预期工作。
显然,如果我们像这样在
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',
});