Как удалить список файлов, соответствующих критериям, с помощью Google Drive API и 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) { })
}
}
});
}
1 ответ
Таким образом, используя Javascript Drive API, вы сначала выполните GET
к конечной точке файлов, используя list
действие, которое поддерживает ваш параметр запроса q
, Похоже, вы уже поняли это.
Вы получите объект ответа - чтобы получить более конкретную информацию, вам потребуется опубликовать некоторый код. Вы используете VanillaJS XMLHttpRequest
JQuery's $.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
к файлам. список завершен. - Проходит через
responseJSON.items
и вызывает функцию ниже с itemId.
- Называется когда твой
Функция, которая выдает
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() {/* ... */}