Google API 驱动器:使用 node.js 上传文件但是,如何使用工作区帐户的 1TB 存储空间而不是用于授权的 15GB 服务帐户存储空间?
Google API Drive: Upload files using node.js but, How use the 1TB storage of a workspace account and not the 15GB of service account used to auth?
我在我的服务器上开发了一个进程,使用 Node.js 将多个文件上传到 google 驱动器帐户。
首先,我在我的 Google 工作space 帐户中购买了额外的存储空间 (1 TB) 以拥有足够的 space。让我们调用 Google 帐户 user.account@domain.com
然后,我在 user.account@domain.com 下创建了一个服务帐户,并从 node.js.
我已经为模拟过程添加了具有域范围委托的服务 ID 帐户。
我已经定义了所有需要的范围:
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.file
https://www.googleapis.com/auth/drive.appdata
- 最后,我在 JavaScript 中添加了所有假定需要的实现。下一个代码只是来自 JavaScript 实现的 auth Google API 的声明:
const { google } = require('googleapis');
// service account key file from Google Cloud console.
const KEYFILEPATH = 'upload-files-server-to-drive-7a5e1bf2dcbe.json';
// Request full drive access.
const SCOPES = ['https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/drive.file','https://www.googleapis.com/auth/drive.appdata'];
// Create a service account initialize with the service account key file and scope needed
const auth = new google.auth.GoogleAuth({
keyFile: KEYFILEPATH,
scopes: SCOPES
});
auth.subject = 'user.account@domain.com';
const driveService = google.drive({version: 'v3', auth});
module.exports = {
driveService
}
- 下一个函数在模块内部,这里是上传发生的地方:
const upload = async ( params ) => new Promise (async ( resolve, reject ) => {
const driveService = params.driveService;
const fileMetadata = {
'name': `${params.id_numero}${params.name}`,
'parents': [ params.parentId ]
};
try {
if (fs.existsSync(params.folder + params.name)) {
//file exists
}else{
reject({
result: "error",
message:"El archivo no existe. No se puede subir nada. "
})
return
}
} catch(err) {
console.log(err)
reject({
result: "error",
message: "Hubo un error" . err
})
return
}
// Definición del archivo que se desea subir
const media = {
mimeType: params.mimeType,
body: fs.createReadStream(params.folder + params.name)
};
await driveService.files.create({
resource: fileMetadata,
media: media,
fields: 'id'
})
.then( response => {
console.log(response)
switch(response.status){
case 200:
let file = response.result;
resolve({
result: "success",
message:'Created File Id: ' + response.data.id,
url : "http://drive.google.com/uc?export=view&id="+response.data.id,
id : response.data.id
})
break;
default:
console.error('Error creating the file, ' + response.errors);
reject({
result: "error",
message:"Error al crear el archivo en Drive, " + response.errors
})
break;
}
})
.catch( e => {
console.log(e)
reject({
result: "error",
message:"ERROR. No se puede acceder a DRIVE " ,
error : e.errors
})
return
})
})
上面的代码绝对适用于将文件上传到驱动器。但是,尽管 user.account@domain.com 有足够的 space(100% 免费 1TB)所有上传的文件仍在默认服务帐户上上传存储,其中一个只有15GB。
设置为在所需存储上上传我缺少什么?
感谢您的帮助!
文档和参考资料:https://developers.google.com/admin-sdk/directory/v1/guides/delegation
Google API 范围:https://developers.google.com/drive/api/v3/reference/files/create#auth
对于模拟你可以尝试:
const auth = new google.auth.GoogleAuth({
keyFile: './service.json',
scopes: [
'https://www.googleapis.com/auth/contacts',...
],
clientOptions: {
subject: 'email@email.com'
},
});
您需要根据您的代码和您正在做的事情来编辑它。
我在我的服务器上开发了一个进程,使用 Node.js 将多个文件上传到 google 驱动器帐户。
首先,我在我的 Google 工作space 帐户中购买了额外的存储空间 (1 TB) 以拥有足够的 space。让我们调用 Google 帐户 user.account@domain.com
然后,我在 user.account@domain.com 下创建了一个服务帐户,并从 node.js.
我已经为模拟过程添加了具有域范围委托的服务 ID 帐户。
我已经定义了所有需要的范围:
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.file
https://www.googleapis.com/auth/drive.appdata
- 最后,我在 JavaScript 中添加了所有假定需要的实现。下一个代码只是来自 JavaScript 实现的 auth Google API 的声明:
const { google } = require('googleapis');
// service account key file from Google Cloud console.
const KEYFILEPATH = 'upload-files-server-to-drive-7a5e1bf2dcbe.json';
// Request full drive access.
const SCOPES = ['https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/drive.file','https://www.googleapis.com/auth/drive.appdata'];
// Create a service account initialize with the service account key file and scope needed
const auth = new google.auth.GoogleAuth({
keyFile: KEYFILEPATH,
scopes: SCOPES
});
auth.subject = 'user.account@domain.com';
const driveService = google.drive({version: 'v3', auth});
module.exports = {
driveService
}
- 下一个函数在模块内部,这里是上传发生的地方:
const upload = async ( params ) => new Promise (async ( resolve, reject ) => {
const driveService = params.driveService;
const fileMetadata = {
'name': `${params.id_numero}${params.name}`,
'parents': [ params.parentId ]
};
try {
if (fs.existsSync(params.folder + params.name)) {
//file exists
}else{
reject({
result: "error",
message:"El archivo no existe. No se puede subir nada. "
})
return
}
} catch(err) {
console.log(err)
reject({
result: "error",
message: "Hubo un error" . err
})
return
}
// Definición del archivo que se desea subir
const media = {
mimeType: params.mimeType,
body: fs.createReadStream(params.folder + params.name)
};
await driveService.files.create({
resource: fileMetadata,
media: media,
fields: 'id'
})
.then( response => {
console.log(response)
switch(response.status){
case 200:
let file = response.result;
resolve({
result: "success",
message:'Created File Id: ' + response.data.id,
url : "http://drive.google.com/uc?export=view&id="+response.data.id,
id : response.data.id
})
break;
default:
console.error('Error creating the file, ' + response.errors);
reject({
result: "error",
message:"Error al crear el archivo en Drive, " + response.errors
})
break;
}
})
.catch( e => {
console.log(e)
reject({
result: "error",
message:"ERROR. No se puede acceder a DRIVE " ,
error : e.errors
})
return
})
})
上面的代码绝对适用于将文件上传到驱动器。但是,尽管 user.account@domain.com 有足够的 space(100% 免费 1TB)所有上传的文件仍在默认服务帐户上上传存储,其中一个只有15GB。
设置为在所需存储上上传我缺少什么?
感谢您的帮助!
文档和参考资料:https://developers.google.com/admin-sdk/directory/v1/guides/delegation
Google API 范围:https://developers.google.com/drive/api/v3/reference/files/create#auth
对于模拟你可以尝试:
const auth = new google.auth.GoogleAuth({
keyFile: './service.json',
scopes: [
'https://www.googleapis.com/auth/contacts',...
],
clientOptions: {
subject: 'email@email.com'
},
});
您需要根据您的代码和您正在做的事情来编辑它。