我正在尝试将我的应用与Google云端硬盘同步。现在,当我们将文件上传到云端硬盘时,我们会在本地保存文件ID和元数据(到Redis)。然后,下次我们从Drive获取推送通知时,我们会比较以查看该文件是否与我们本地版本不同,或者是否需要更新,删除或创建文件。
我正在加载像这样的文件
media_body = MediaFileUpload(local_path,
mimetype='binary/octet-stream',
chunksize=50000000,
resumable=True)
body = {'title': file_name, 'parents': [{'id': parent_id}]}
request = client.files().insert(
body=body,
media_body=media_body)
response = None
while response is None:
status, response = request.next_chunk()
if status:
print "Uploaded %d%%." % int(status.progress() * 100)
results.append(response)
然后results
立即保存到Redis(文件ID,元数据......)。
问题是我们偶尔会收到推送通知,检测到文件已添加到云端硬盘,但我们尚未将该ID保存到Redis。所以它注册为一个新文件意味着我们现在下载它并且有两个版本的文件。
我认为Google Drive必须在上传API调用返回之前发送更改推送通知。我无法在上传之前将ID添加到Redis,因为在上传功能返回之前我们不知道...可以有人建议可能的解决方案吗?
答案 0 :(得分:0)
由于您正在创建文件并在单个命令中上载媒体内容,因此导致(或至少更糟)问题。如果您将文件与媒体分离(即插入没有内容的文件,然后使用内容更新它),您应该没问题。请记住,如果您这样做,您将收到2个通知,一个用于插入,另一个用于更新的内容。
或者,有这样的逻辑......
havePendingInsert = true
request = client.files().insert(... // your line 6
havePendingInsert = false
processAnyCachedPushNotifications()
and in your module which deals with push notifications...
if (havePendingInsert) {
storeNotificationInCache()
} else {
processNotificationNow()
}