我正在尝试使用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();
}
}
}
答案 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()
有效。希望对您有帮助。