#java #spring-boot #google-drive-api
Вопрос:
Я создаю spring boot api, используя API диска, чтобы назначить разрешение пользователю (через идентификатор электронной почты), предоставив доступ к папке, созданной на общем диске
Я получаю ошибку "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*********"
}
Комментарии:
1. так… есть ли у вас такой файл и хранится ли он в нужном месте?
2. Да, у меня есть файл, и он хранится в нужном месте
3. Когда я пытаюсь ввести URL ниже, он работает нормально. В параметрах запроса, которые я предоставил (fileID= i6fBhgd*********, supportsAllDrives=true, supportsTeamDrives=true). В теле запроса я указал { «роль»: «читатель», «тип»: «пользователь», «Адрес электронной почты»: «test@email.com» } developers.google.com/drive/api/v3/reference/permissions/create
Ответ №1:
Если вы проверите страницу ошибок API привода:
notFound
Ошибка возникает, когда у пользователя нет доступа для чтения к файлу или файл не существует.Чтобы исправить эту ошибку:
- Сообщите пользователю, что у него нет доступа для чтения к файлу или что файл не существует.
- Проинструктируйте пользователя запросить у владельца разрешение на доступ к файлу.
Поэтому, поскольку вы упомянули, что файл действительно существует, похоже, что вы столкнулись с ошибкой, связанной с правами доступа к файлу.
Как уже упоминалось выше, если вы хотите изменить права доступа к файлу, сначала у вас должен быть доступ для чтения к самому файлу.
Если у вас один владелец файлов на общем диске, вам может быть полезно создать учетную запись службы, которая в конечном итоге будет выдавать себя за этого владельца. Таким образом, учетная запись службы выступает в качестве владельца этих файлов, и может быть проще и безопаснее создавать разрешения, поскольку никакие другие разрешения не нужно добавлять в файл.
Ссылка
Комментарии:
1. Спасибо вам за подробности. Я попробовал, как показано ниже 1. Создайте учетную запись службы (учетная запись g-службы) и назначьте роль «Менеджер» для этого общего диска. 2. Когда мне звонят, чтобы перечислить все папки, это работает нормально 3. Когда я отправляю вызов для назначения роли «читатель» моей электронной почте для папки на этом общем диске, он возвращает ту же ошибку
2. Но какие у вас есть разрешения для этой папки? Можете ли вы получить разрешения только для этой конкретной папки?
3. Когда мне все-таки позвонят ( developers.google.com/drive/api/v3/reference/permissions/list ) чтобы перечислить все разрешения для этой конкретной папки, я вижу, что учетная запись службы и учетная запись g-службы имеют роль «организатор».
4. А как насчет
view
того, что в ответе? Что делать, если вы также явно добавите роль читателя?5. Из ответа нет
view
поля. Я вижу только то, что показано ниже{ "kind": "drive#permissionList", "permissions": [ { "kind": "drive#permission", "id": "025043000234", "type": "user", "role": "organizer" }, { "kind": "drive#permission", "id": "0283762644325", "type": "user", "role": "organizer" } ] }
Ответ №2:
Чтобы вызвать разрешения.создайте пользователя, который в настоящее время проходит проверку подлинности, необходимо иметь разрешения на сам файл.
Файл не найден: i6fBhgd*********
Мне кажется, что текущий пользователь не имеет доступа к файлу i6fBhgd********* без доступа они не могут предоставить разрешения
Создайте файл.сначала убедитесь, что у пользователя есть доступ.
что делать.
Проблема, с которой вы столкнулись прямо сейчас, заключается в том, что человек, запустивший файл, тот, кто его авторизовал, не имеет доступа. Вам нужно, чтобы владелец файла запустил приложение, авторизовал его, чтобы этот человек мог затем изменить разрешения на файл.
Вам нужен доступ к личным данным, прежде чем вы сможете их изменить.
Комментарии:
1. @DalmTo Пользователю назначена роль «Менеджер» для общего диска. Когда я попробовал file.get через пользовательский интерфейс, он вернул ту же ошибку.
2. Именно у пользователя нет доступа. просто потому, что вы менеджер, не означает, что у вас есть доступ ко всему. Исправьте доступ пользователей, и они смогут получить доступ к файлу, а затем изменить разрешения.
3. @DalmTo Как мне исправить доступ ? У меня есть только варианты (Просмотрщик, Комментатор, Участник, Контент-менеджер, Менеджер) Я попытался изменить доступ с «Менеджера» на «Контент-менеджер», и он возвращает ту же ошибку
4. Попросите владельца файла предоставить им доступ. Я не думаю, что это то, что вы можете заставить только потому, что они менеджер.
5. Вы имеете в виду через пользовательский интерфейс, где владелец файла может предоставить доступ ? Это возможно через пользовательский интерфейс, так как владелец получает уведомление о предоставлении доступа. Но разве это невозможно через API ?