如何删除满足 Google 驱动器 API 和 Javascript 条件的文件列表?
How do I delete a list of files meeting criteria with Google Drive API and Javascript?
我想用 get list 得到一个列表(我已经在其中编码),但接下来,我想要一个删除按钮来删除该列表中的所有内容。我如何使用 Google Drive SDK 和 Javascript 做到这一点?
例如,如果我的标准是:
q: "starred = "+test+" and viewedByMeTime < '"+n+""
如何删除满足该条件的每个文件?
参考文献:https://developers.google.com/drive/v2/reference/files/delete
https://developers.google.com/drive/v2/web/search-parameters
我尝试将搜索文件和删除文件放在一起,但我真的很不擅长,我不确定哪个变量代表找到的所有符合条件的文件以及如何使该变量成为 fileID:
function DeleteFiles() {
var x = document.getElementById("ResultShown").value;
var date = new Date();
date.setDate(date.getDate() - 180);
var n = date.toISOString().split('.')[0] ;
var test = false;
gapi.client.drive.files.list({
pageSize: x,
q: "starred = "+test+" and viewedByMeTime < '"+n+"'",
fields: "nextPageToken, files(id)",
}
).then(function deleteFile(fileId)) {
var request = gapi.client.drive.files.delete({
appendPre('Files:');
var files = response.result.files;
if (files && files.length > 0) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
'fileId': fileId
});
request.execute(function(resp) { })
}
}
});
}
因此,使用 Javascript 驱动器 API,您将首先向 files 端点发出 GET
,使用支持您的 list
操作查询参数 q
。听起来你已经明白了。
您将获得一个响应对象——要获得更具体的信息,您需要 post 一些代码。您使用的是 VanillaJS XMLHttpRequest
、jQuery 的 $.ajax()
,还是美味的原生异步 fetch()
API?无论哪种方式,您都会得到一个可以解析为 JSON.
的响应
如您所知,Drive API 不支持在一次请求中永久删除多个 Drive 资源。此时,您可能正在重新考虑应用程序的架构:删除一个很长的列表可能需要很多 HTTP 请求。这可能会产生巨大的开销,因此您可能想限制列表的长度或做一些其他聪明的事情。如果您决定走这条路,我建议您使用 fetch
来异步使用 API。
所以在你调用 JSON.parse(responseBody)
(或者 responseBody.json()
,如果你使用 fetch()
)之后,你会从 Google API 得到一些看起来像像这样:
{
"kind": "drive#fileList",
"etag": "...",
"selfLink": "https://www.googleapis.com/drive/v2/files",
"nextPageToken": "...",
"nextLink": "...",
"incompleteSearch": false,
"items": [
{
"kind": "drive#file",
"id": "SOME FILE ID",
"etag": "...",
"selfLink": "...",
"alternateLink": "...",
"embedLink": "...",
"openWithLinks": {
...
},
{
"kind": "drive#file",
"id": "SOME FILE ID",
"etag": "...",
"selfLink": "...",
"alternateLink": "...",
"embedLink": "...",
"openWithLinks": {
...
}
]
所以你需要的是:
一个函数:
- 在
GET
到 files.list 完成时调用。
- 循环
responseJSON.items
并使用 itemId 调用下面的函数。
给定 ID 发出 HTTP DELETE
的函数。
因此,在没有任何具体实施细节的情况下,针对您的目的的通用解决方案可能如下所示:
var apiEndpoint = new URL("https://www.googleapis.com/drive/v2/files"),
params = {q: "some stuff", otherParams: "lol"}
// assemble GET querystring in a nice way
Object.keys(params).forEach(function(key) {
apiEndpoint.searchParams.append(key, params[key]);
});
// go and fetch! (explicit HTTP header options optional but good practice)
fetch(apiEndpoint , {
method: 'GET',
mode: 'cors',
redirect: 'follow',
headers: new Headers({
'Content-Type': 'application/json'
})
});
.then(function (responseBody) {
return responseBody.json();
})
.then(function (responseObj) {
for(i=0; i<responseObj.items.length; i++) {
asyncDeleteDriveItem(responseObj.items[i].id);
}
});
});
function asyncDeleteDriveItem() {/* ... */}
我想用 get list 得到一个列表(我已经在其中编码),但接下来,我想要一个删除按钮来删除该列表中的所有内容。我如何使用 Google Drive SDK 和 Javascript 做到这一点?
例如,如果我的标准是:
q: "starred = "+test+" and viewedByMeTime < '"+n+""
如何删除满足该条件的每个文件?
参考文献:https://developers.google.com/drive/v2/reference/files/delete https://developers.google.com/drive/v2/web/search-parameters
我尝试将搜索文件和删除文件放在一起,但我真的很不擅长,我不确定哪个变量代表找到的所有符合条件的文件以及如何使该变量成为 fileID:
function DeleteFiles() {
var x = document.getElementById("ResultShown").value;
var date = new Date();
date.setDate(date.getDate() - 180);
var n = date.toISOString().split('.')[0] ;
var test = false;
gapi.client.drive.files.list({
pageSize: x,
q: "starred = "+test+" and viewedByMeTime < '"+n+"'",
fields: "nextPageToken, files(id)",
}
).then(function deleteFile(fileId)) {
var request = gapi.client.drive.files.delete({
appendPre('Files:');
var files = response.result.files;
if (files && files.length > 0) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
'fileId': fileId
});
request.execute(function(resp) { })
}
}
});
}
因此,使用 Javascript 驱动器 API,您将首先向 files 端点发出 GET
,使用支持您的 list
操作查询参数 q
。听起来你已经明白了。
您将获得一个响应对象——要获得更具体的信息,您需要 post 一些代码。您使用的是 VanillaJS XMLHttpRequest
、jQuery 的 $.ajax()
,还是美味的原生异步 fetch()
API?无论哪种方式,您都会得到一个可以解析为 JSON.
如您所知,Drive API 不支持在一次请求中永久删除多个 Drive 资源。此时,您可能正在重新考虑应用程序的架构:删除一个很长的列表可能需要很多 HTTP 请求。这可能会产生巨大的开销,因此您可能想限制列表的长度或做一些其他聪明的事情。如果您决定走这条路,我建议您使用 fetch
来异步使用 API。
所以在你调用 JSON.parse(responseBody)
(或者 responseBody.json()
,如果你使用 fetch()
)之后,你会从 Google API 得到一些看起来像像这样:
{
"kind": "drive#fileList",
"etag": "...",
"selfLink": "https://www.googleapis.com/drive/v2/files",
"nextPageToken": "...",
"nextLink": "...",
"incompleteSearch": false,
"items": [
{
"kind": "drive#file",
"id": "SOME FILE ID",
"etag": "...",
"selfLink": "...",
"alternateLink": "...",
"embedLink": "...",
"openWithLinks": {
...
},
{
"kind": "drive#file",
"id": "SOME FILE ID",
"etag": "...",
"selfLink": "...",
"alternateLink": "...",
"embedLink": "...",
"openWithLinks": {
...
}
]
所以你需要的是:
一个函数:
- 在
GET
到 files.list 完成时调用。 - 循环
responseJSON.items
并使用 itemId 调用下面的函数。
- 在
给定 ID 发出
HTTP DELETE
的函数。
因此,在没有任何具体实施细节的情况下,针对您的目的的通用解决方案可能如下所示:
var apiEndpoint = new URL("https://www.googleapis.com/drive/v2/files"),
params = {q: "some stuff", otherParams: "lol"}
// assemble GET querystring in a nice way
Object.keys(params).forEach(function(key) {
apiEndpoint.searchParams.append(key, params[key]);
});
// go and fetch! (explicit HTTP header options optional but good practice)
fetch(apiEndpoint , {
method: 'GET',
mode: 'cors',
redirect: 'follow',
headers: new Headers({
'Content-Type': 'application/json'
})
});
.then(function (responseBody) {
return responseBody.json();
})
.then(function (responseObj) {
for(i=0; i<responseObj.items.length; i++) {
asyncDeleteDriveItem(responseObj.items[i].id);
}
});
});
function asyncDeleteDriveItem() {/* ... */}