无法使用 Drive API v3 更新 Google Drive 文件 - 资源正文包含不可直接写入的字段

Vin*_*Yau 10 java google-drive-api

我正在尝试使用 Google Drive API (v3) 更新 Google Drive 中的文档。

我已阅读此迁移指南: Google Drive API v3 迁移

并对其进行编码以创建一个新的空 File(),其中包含我想要更新的详细信息,然后使用该信息和文件 ID 调用execute()。但我仍然收到错误。谁能指出我做错了什么?多谢!!

错误:

{
    "code" : 403,
    "errors" : [{
        "domain" : "global",

        "message" : "The resource body includes fields which are not directly writable.",

        "reason" : "fieldNotWritable"
    }],
    "message" : "The resource body includes fields which are not directly writable."
}
Run Code Online (Sandbox Code Playgroud)

代码片段如下:

File newFileDetails = new File();        
FileList result = service2.files().list()
    .setPageSize(10)    
    .setFields("nextPageToken, files(id, name)")
    .execute();

List<File> files = result.getFiles();

if (files == null || files.size() == 0) {

    System.out.println("No files found.");

} else {

   System.out.println("Files:");

   for (File file : files) {

      if (file.getName().equals("first_sheet")) {

         System.out.printf("%s (%s)\n", file.getName(), file.getId());


         newFileDetails.setShared(true);


         service2.files().update(file.getId(), newFileDetails).execute();

      }

   }

}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lev 6

我有同样的问题并找到了解决方案。关键点是:您必须创建一个没有 Id 的新 File 对象,并在 update() 方法中使用它。这是我的一段代码:

val oldMetadata = service!!.files().get(fileId.id).execute()

val newMetadata = File()
newMetadata.name = oldMetadata.name
newMetadata.parents = oldMetadata.parents
newMetadata.description = idHashPair.toDriveString()

val content = ByteArrayContent("application/octet-stream", fileContent)

val result = service!!.files().update(fileId.id, newMetadata, content).execute()
Run Code Online (Sandbox Code Playgroud)

有用。我希望它能帮助你。


pin*_*yid 3

参考https://developers.google.com/drive/v3/reference/files#resource-representations,您可以看到这shared不是一个可写字段。如果你仔细想想,这是完全有道理的。您可以通过添加新权限来共享文件,并且可以通过读取共享属性来检查文件是否已共享。但是,除了实际共享文件之外,说文件已共享是没有任何意义的。