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

时间:2016-08-29 17:36:35

标签: google-drive-api

我正在尝试使用Google Drive API(v3)对文档进行更新 在Google云端硬盘中。

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

并将其编码为一个新的空文件(),其中包含我想要更新的详细信息 然后用它和文件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."
}

以下代码段:

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

      }

   }

}

3 个答案:

答案 0 :(得分:3)

在代码中看起来像这样

Drive service... // your own declared implementation of service
File  file = new File(); //using the com.google.api.services.drive.model package
    // part where you set your data to file like:
file.setName("new name for file");
String fileID = "id of file, which you want to change";
service.files().update(fileID,file).execute();

尝试更改远程文件中的字段,然后重写为该文件可能会引发安全异常,例如以下异常。 但这不是您问题的解决方案。   如果您想通过电子邮件将文件共享到另一个Google帐户,则可以使用应用程序的服务帐户重新实现授权以重新授权,并添加所需的电子邮件作为文件所有者。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我遇到了同样的问题,并找到了解决方案。关键点是:您必须创建一个没有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()

有效。希望对您有帮助。