【问题标题】:File not found error Google Drive API: Springboot找不到文件错误Google Drive API:Springboot
【发布时间】:2021-10-15 13:54:09
【问题描述】:

我正在使用 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*********"
}

【问题讨论】:

  • so ...你有这样的文件吗,它存储在正确的地方吗?
  • 是的,我有这个文件,它存储在正确的位置
  • 当我在下面的 URL 中尝试时,它工作正常。在我提供的请求参数中(fileID= i6fBhgd*********,supportsAllDrives=true,supportsTeamDrives=true)。在请求正文中,我提供了 { "role": "reader", "type": "user", "emailAddress": "test@email.com" } developers.google.com/drive/api/v3/reference/permissions/create

标签: java spring-boot google-drive-api


【解决方案1】:

如果您检查 Drive API error page

notFound 错误发生在用户对文件没有读取权限或文件不存在时。

修复此错误:

  1. 通知用户他们没有文件的读取权限或文件不存在。
  2. 指示用户向所有者请求文件的权限。

因此,既然您提到该文件确实存在,那么您遇到的似乎实际上是与文件权限有关的错误。

就像上面提到的,如果你想改变一个文件的权限,首先你必须有文件本身的读取权限。

如果您对共享云端硬盘中的文件只有一个所有者,您可能会受益于创建一个最终冒充该所有者的服务帐户。通过这种方式,服务帐户充当这些文件的所有者,并且创建权限可能更容易和更安全,因为不需要向文件添加其他权限。

参考

【讨论】:

  • 感谢您提供详细信息。我尝试如下 1. 创建服务帐户(g-service 帐户)并为此共享驱动器分配“经理”角色。 2. 当我执行 GET 调用列出所有文件夹时,它工作正常 3. 当我执行 POST 调用为我的电子邮件分配此共享驱动器下的文件夹的“读者”角色时,它返回相同的错误
  • 但是你对这个文件夹有什么权限?你能只检索这个特定文件夹的权限吗?
  • 当我对 (developers.google.com/drive/api/v3/reference/permissions/list) 进行 GET 调用以列出此特定文件夹的所有权限时,我看到服务帐户和 g-service 帐户都具有“组织者”角色
  • 响应中的view 怎么样?如果您也明确添加读者角色会怎样?
  • 响应中没有view 字段。我只看到如下{ "kind": "drive#permissionList", "permissions": [ { "kind": "drive#permission", "id": "025043000234", "type": "user", "role": "organizer" }, { "kind": "drive#permission", "id": "0283762644325", "type": "user", "role": "organizer" } ] }
【解决方案2】:

为了调用permissions.create,当前经过身份验证的用户需要自己对该文件具有权限。

找不到文件:i6fBhgd**********

暗示当前用户无权访问文件 i6fBhgd********* 没有访问权限,他们无法授予权限

执行 file.get 以确保用户首先具有访问权限。

做什么。

您现在遇到的问题是运行文件的人没有访问权限。您需要文件的所有者来运行应用程序授权它,然后该人可以更改文件的权限。

您需要先访问私有数据,然后才能对其进行更改。

【讨论】:

  • @DalmTo 用户为共享驱动器分配了“经理”角色。当我通过 UI 尝试 file.get 时,它返回了相同的错误。
  • 正是用户无权访问。仅仅因为您是经理并不意味着您可以访问所有内容。修复用户访问权限,他们将能够访问文件,然后更改权限。
  • @DalmTo 如何修复访问权限?我只有选项(查看者、评论者、贡献者、内容管理员、管理员)我尝试将访问权限从“管理员”更改为“内容管理员”,但它返回相同的错误
  • 让文件的所有者授予他们访问权限。我不认为这是你可以仅仅因为他们是经理就强迫的事情。
  • 您的意思是通过文件所有者可以授予访问权限的 UI 吗?所有者可以通过 UI 获得授予访问权限的通知。但是不能通过 API 实现吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2018-10-26
相关资源
最近更新 更多