我正在创建一个有待办事项的待办事项列表应用程序,我希望我的用户能够在Google云端硬盘上备份其任务。这是我正在使用的代码:
// Create the file we want to upload.
ga.File fileToUpload = ga.File();
var file = await _localFile;
fileToUpload.parents = ["appDataFolder"];
fileToUpload.name = path.basename(file.absolute.path);
// Create a new back-up file on google drive.
var response = await drive.files.create(
fileToUpload,
uploadMedia: ga.Media(file.openRead(), file.lengthSync()),
);
// Get the file id.
fileId = response.id;
问题是,每次我获得不同的文件ID时,我都需要检索该文件从谷歌驱动器始终具有相同的文件ID,而不是每次都具有不同的ID。
我尝试使用update方法而不是create方法:
ga.File fileToUpload = ga.File();
var file = await _localFile;
fileToUpload.parents = ["appDataFolder"];
fileToUpload.name = path.basename(file.absolute.path);
drive.files.update(fileToUpload, fileId);
但是我得到未处理的异常:DetailedApiRequestError(状态:403,消息:在更新请求中不能直接写出Parents字段。请改用addParents和removeParents参数。)
在使用create方法之前,我还试图设置文件ID:
fileToUpload.id = fileId;
await drive.files.create(
fileToUpload,
uploadMedia: ga.Media(file.openRead(), file.lengthSync()),
);
但是我得到未处理的异常:DetailedApiRequestError(状态:400,消息:提供的文件ID不能使用。)或具有该ID的文件已经存在。
因此,我尝试从Google驱动器中删除文件,然后使用相同的ID重新创建它:
fileToUpload.id = fileId;
drive.files.get(fileId).then((value) {
if (value != null) {
drive.files.delete(fileId).then((value) {
drive.files.create(
fileToUpload,
uploadMedia: ga.Media(file.openRead(), file.lengthSync()),
);
});
} else {
drive.files.create(
fileToUpload,
uploadMedia: ga.Media(file.openRead(), file.lengthSync()),
);
}
});
但是我也收到未处理的异常:DetailedApiRequestError(状态:400,消息:提供的文件ID不可用。)即使我使用的是Google驱动器为原始文件指定的相同文件ID。
任何解决方案?
首先需要检查文件名是否存在于驱动器中。由于没有直接的API从Google驱动器中提取具有名称的文件,因此您需要使用List api
并先获取文件,然后再检查其名称
为此,您可以使用以下查询
List api
获得响应后,您可以检查文件名是否存在。如果获取其ID并触发文件的{
q: `'appDataFolder' in parents and trashed = false`
}
。但是,您可以在查询中传递update call
而不是[C0
update call
如果找不到该文件,则按照创建新文件的方法进行
parents