0

我的Android應用更新了Google Drive文檔。該文件也可以在其他地方修改(例如,通過Drive web界面),所以文件上傳可能存在衝突。但是,這應該很少發生。這就是爲什麼我不希望我的應用程序首先查詢修訂歷史記錄(因爲這在大多數情況下是不必要的),只有在此之後,才能更新文件。 如何檢測更新文件時是否存在衝突?將文檔上傳到Google Drive時檢測到衝突

我到目前爲止的調查顯示,getHeadRevisionId() returns null雖然null head revision id has been reported fixed。 我試過的另一件事是更新()之前的文件setEtag()。 It should have given me error on update,但即使文件已被遠程更改,上傳也是成功的!這是使用ETag的正確方法嗎?

回答

1

設置If-Match HTTP標頭:

final Update update = mService.files().update(mDriveFile.getId(), mDriveFile, byteContent); 
final HttpHeaders headers = update.getRequestHeaders(); 
headers.setIfMatch(mDriveFile.getEtag()); 
update.setRequestHeaders(headers); 
mDriveFile = update.execute(); 

如果該文檔已同時改變,更新將被拒絕使用響應類似:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 412 Precondition Failed 
{ 
    "code": 412, 
    "errors": [ 
    { 
     "domain": "global", 
     "location": "If-Match", 
     "locationType": "header", 
     "message": "Precondition Failed", 
     "reason": "conditionNotMet" 
    } 
    ], 
    "message": "Precondition Failed" 
} 

注意ETag might change even if the content does not

+0

如何在v3上使用這種方法? [v2中有File.getEtag()](https://developers.google.com/resources/api-libraries/documentation/drive/v2/java/latest/com/google/api/services/drive/model /File.html#getEtag()),但它[已在v3中](https://developers.google.com/resources/api-libraries/documentation/drive/v3/java/latest/)。 – surlac

1

「這是使用ETag的正確方法嗎?」

此外,對於非文檔文件,還需要檢查md5Checksum更改的內容。

+0

因此,如果這是使用ETag的正確方法,爲什麼我的文件更新失敗? –

+0

你可以粘貼http請求和響應。 – pinoyyid

+0

我的猜測是setEtag()沒有設置If-Match頭。您可能需要手動設置它。看到http請求應該證實這一點。 – pinoyyid

相關問題