rest - 如何在 Apps 脚本上使用 REST 将文件插入共享驱动器?
问题描述
有没有一种方法可以使用 POST 方法将文件上传到共享驱动器?我不知道如何调用共享驱动器的驱动器 ID 并将其定位到 URL 获取功能,这可能吗?
这是我的代码:
var DriveScope = 'https://www.googleapis.com/auth/drive';
var ServiceAccountPrivateKey ="-----BEGIN PRIVATE KEY----"
var ServiceAccountEmail = "drive-uploads@xxxxxxx.com";
function testinRest(){
var service = getDriveService();
var driveID = "XXXXXXXX";
var APIKey = "XXXXXXXXXXXXX";
var resumeBlob = Utilities.newBlob('Hire me!', 'text/plain', 'resume.txt');
var formData = {
'name': 'Bob Smith',
'email': 'bob@example.com',
'resume': resumeBlob
};
var url = 'https://www.googleapis.com/drive/v3/drives';
var output = UrlFetchApp.fetch(url, {
method: 'get',
headers: { 'Authorization': 'Bearer ' + service.getAccessToken() },
contentType: 'application/json'
}).getContentText();
var response= JSON.parse(output);
for(var i=0; i < response.drives.length; i++){
if(driveID == response.drives[i].id){
service.reset()
if (service.hasAccess()) {
var newPresentationName = "RJ POGI";
var url = 'https://www.googleapis.com/upload/drive/v3/files?supportsAllDrives=true&key=' + APIKey;
var body = {
"name": newPresentationName,
"parents": [driveID]
};
var params = {
headers: {
Authorization: 'Bearer ' + service.getAccessToken(),
Referer:'https://explorer.apis.google.com'
},
method: 'post',
payload: formData,//JSON.stringify(body),
contentType: 'application/json',
muteHttpExceptions: true
};
var response = UrlFetchApp.fetch(url, params).getContentText();
Logger.log('response: ' + response);
var id = JSON.parse(response).id;
return id;
}
}
}
}
function getDriveService(){
var service = OAuth2.createService('drive').setTokenUrl('https://accounts.google.com/o/oauth2/token').setPrivateKey(ServiceAccountPrivateKey).setClientId(ServiceAccountEmail).setPropertyStore(PropertiesService.getUserProperties()).setScope(DriveScope);
//console.log("Service::" + service);
//console.log('Service Has Access::' + service.hasAccess());
if (!service.hasAccess()) {
Logger.log('Authentication error: %s', service.getLastError());
return;
}else{
return service;
}
}
function reset() {
var service = getDriveService();
service.reset();
}
在此示例中,我希望将 resumeBlob 插入目标 DriveID。任何帮助将不胜感激。谢谢!
解决方案
您的问题需要分为三个步骤:
- 在驱动器上创建一个文件
UrlFetchApp
- 将内容传递给文件
- 将文件插入共享云端硬盘
- 在驱动器上创建一个文件
现在,你原来的问题 -
3.
很容易解决,你只需要在你的请求中指定supportsTeamDrives=true
。更难的是 和 的
1.
组合2.
。该
Files: create
方法为media upload
仅请求提供 URI,或为metadata-only
.解决方法是执行
resumable Upload
,它允许您先发布元数据,然后再添加文件内容。您需要使用的 URI 是
"https://www.googleapis.com/upload/drive/v3/files?supportsTeamDrives=true&uploadType=resumable"
.
样本:
function uploadToSharedDrive(){
var url = "https://www.googleapis.com/upload/drive/v3/files?supportsTeamDrives=true&uploadType=resumable";
var resumeBlob = Utilities.newBlob('Hire me!');
var formData = {
'name': 'Bob Smith',
'mimeType': 'text/plain',
'parents': [
"ID of the shared drive"
]
};
params = {
headers: {
Authorization: 'Bearer ' + service.getAccessToken()
},
contentType: 'application/json',
method: 'post',
payload: JSON.stringify(formData),
}
var response = UrlFetchApp.fetch(url, params);
Logger.log(response.getContentText());
data = resumeBlob.getBytes();
var params2 = {
method: "put",
payload: data,
muteHttpExceptions: true,
};
var location = response.getHeaders().Location;
var response = UrlFetchApp.fetch(location, params2);
Logger.log(response.getContentText())
}
推荐阅读
- pytorch - 在 Pytorch 中对整数张量执行最大池化
- python - 如何在 Python 中将字典更新为另一个嵌套字典?
- php - 在同一域上使用 jquery ajax 调用进行 post 调用时出现错误 403 Forbidden
- python - 如何让我的 Discord 机器人向聊天室发送消息
- kubernetes - GKE 上的 Kubernetes 持久卷未安装
- python - 调用外部 Python 代码时强制打开 Python 控制台
- angular - 分页后如何动态获取Angular FormArray字段中的绝对索引?
- c# - 具有相同元素的 XML 文件
- google-authenticator - 如何在我的应用程序(nodeJS)中集成谷歌身份验证器?
- android - 无法解决:com.android.support:appcompat-v7:28.3.0