首页 > 解决方案 > 找不到文件错误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*********"
}

标签: javaspring-bootgoogle-drive-api

解决方案


如果您检查 Drive API错误页面

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

要修复此错误:

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

因此,由于您提到该文件确实存在,看来您遇到的实际上是与文件权限有关的错误。

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

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

参考


推荐阅读