java - 找不到文件错误Google Drive API:Springboot
问题描述
我正在使用 Drive API 构建 Spring Boot api,通过授予对在共享驱动器下创建的文件夹的访问权限来向用户分配权限(通过电子邮件 ID)
我得到错误"message" : "File not found: i6fBhgd*********",
详情如下:
控制器:
package com.test.drive.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.test.drive.business.DriveBoException;
import com.test.drive.business.FolderBo;
import com.test.drive.util.DriveIntegrationUtil;
import com.test.drive.vo.DriveFolderVo;
@RestController
public class FolderController {
private static final String CLASS_NAME = FolderController.class.getName();
private static final Logger LOGGER = Logger.getLogger(CLASS_NAME);
@Autowired
private FolderBo folderBo;
// Folder Permission
@PostMapping("/folderpermission")
public DriveFolderVo folderPermission(@RequestBody DriveFolderVo driverFolderVo) {
try {
folderBo.folderPermission(driverFolderVo.getFolderId(), driverFolderVo.getEmailId());
} catch (DriveBoException e) {
LOGGER.logp(Level.SEVERE, CLASS_NAME, "folderPermission", e.getMessage(), e);
throw new RuntimeException();
}
return driverFolderVo;
}
}
班级:
package com.test.drive.business;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.stereotype.Service;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
import com.google.api.services.drive.model.Permission;
import com.test.drive.util.DriveIntegrationUtil;
import com.test.drive.vo.DriveFolderVo;
@Service
public class FolderBo {
private static final String CLASS_NAME = FolderBo.class.getName();
private static final Logger LOGGER = Logger.getLogger(CLASS_NAME);
// Folder Permission
public void folderPermission(String folderId, String emailId) throws DriveBoException {
try {
Drive drive = DriveIntegrationUtil.getDrive();
// List<File> result = new ArrayList<File>();
Files.List request = drive.files().list().setFields("nextPageToken, files(id, name, createdTime)").setQ("mimeType = 'application/vnd.google-apps.folder' and trashed = false");
Permission permission = new Permission();
permission.setEmailAddress(emailId);
permission.setType("user");
permission.setRole("reader");
drive.permissions().create(folderId, permission).setTransferOwnership(false).execute();
request.setIncludeTeamDriveItems(true);
request.setSupportsTeamDrives(true);
} catch (Exception e) {
LOGGER.logp(Level.SEVERE, CLASS_NAME, "folderPermission", e.getMessage(), e);
throw new DriveBoException(e);
}
}
}
错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"location" : "fileId",
"locationType" : "parameter",
"message" : "File not found: i6fBhgd*********",
"reason" : "notFound"
} ],
"message" : "File not found: i6fBhgd*********"
}
解决方案
如果您检查 Drive API错误页面:
notFound
当用户对文件没有读取权限或文件不存在时,会发生此错误。要修复此错误:
- 通知用户他们没有对该文件的读取权限或该文件不存在。
- 指示用户向所有者请求文件的权限。
因此,由于您提到该文件确实存在,看来您遇到的实际上是与文件权限有关的错误。
就像上面提到的,如果你想改变一个文件的权限,首先你必须拥有对文件本身的读取权限。
如果共享驱动器中的文件只有一个所有者,您可能会受益于创建一个最终冒充该所有者的服务帐户。通过这种方式,服务帐户充当这些文件的所有者,并且创建权限可能更容易和更安全,因为不需要将其他权限添加到文件中。
参考
推荐阅读
- python - 更新 PyQt5 中嵌入的 matplotlib 图
- mongodb - Mongodb/Mongoose:如何按字段添加递增数字进行分组?
- html - Selenium VBA - 不会勾选复选框
- azure-data-explorer - 如何从 Kusto 中的日期时间中删除时间部分
- asp.net-core - EF Core 和 Automapper。一对多映射关系
- javascript - 在 JSON 中解析 Ruby var
- java - 将此初始值设定项的内容移动到标准构造函数或字段初始值设定项
- javascript - 未捕获的类型错误:ele.addEventListener 不是函数
- api - GitHub GraphQL API 活动信息
- jquery - 在 jQuery 中使用循环的选择器问题