在谷歌云端硬盘上备份我的本地数据库总是创建一个不同的文件 ID



我正在创建一个带有颤振的待办事项列表应用程序,我希望我的用户能够在谷歌云端硬盘上备份他们的任务。 这是我正在使用的代码:

// 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 并且我需要检索文件 从Google云端硬盘一直使用相同的文件ID,而不是每次都使用不同的ID。

我尝试使用更新方法而不是创建方法:

ga.File fileToUpload = ga.File();
var file = await _localFile;
fileToUpload.parents = ["appDataFolder"];
fileToUpload.name = path.basename(file.absolute.path);
drive.files.update(fileToUpload, fileId);

但是我收到未处理的异常:详细ApiRequestError(状态:403,消息:父字段在更新请求中不可直接写入。请改用 addParents 和 removeParents 参数。

我还尝试在使用创建方法之前设置文件 id:

fileToUpload.id = fileId;
await drive.files.create(
fileToUpload,
uploadMedia: ga.Media(file.openRead(), file.lengthSync()),
);

但随后我收到未处理的异常:详细Api请求错误(状态:400,消息:提供的文件ID不可用。 或者具有该 id 的文件已存在。

所以我尝试从谷歌云端硬盘中删除该文件,然后使用相同的 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()),
);
}
});

但随后我也收到未处理的异常:详细ApiRequestError(状态:400,消息:提供的文件ID不可用。 即使我使用谷歌云端硬盘为原始文件提供的相同文件 ID。

有什么解决办法吗?

您需要首先按名称检查文件是否存在于驱动器中。由于没有直接的API可以从Google云端硬盘获取具有名称的文件,因此您需要使用该List api并在检查文件名称之前先获取文件

为此,您可以使用以下查询

{
q: `'appDataFolder' in parents and trashed = false`
}

获得响应后,您可以按名称检查文件是否存在。如果它获取其 id 并触发文件的update call

注意:您不会传递要上传parents密钥,而是传递addParents

对于媒体上传,您将使用以下网址

PATCH https://www.googleapis.com/upload/drive/v3/files/fileId

如果找不到该文件,则按创建新文件的方法进行操作

// 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()),
);

如果要设置文件的id,则必须使用从google生成的id。这就是为什么你会得到the provided file ID is not usable.您可以使用一个名为generateIds的类,您可以使用它来创建id,该id可以与创建请求一起使用,就像上面所做的那样。Google Drive API 开发者网站有一个工具,您可以在其中向 API 发出请求。它被称为"立即尝试"(如邮递员(例如,在此处创建 id 列表(只需按执行(。选择其中一个 ID 并将其添加到请求正文中(在左侧的请求正文框中,按加号获取id键并添加生成的 Id(。您应该会收到一个 200 响应,其中包含随请求一起发送的 ID。它还将返回一条特定的错误消息,如果 id 已存在,您可以处理该错误消息(代码 409(

您不必指定

fileToUpload.parents = ["appDataFolder"];

更新 Google 云端硬盘中的文件时

最新更新