Я уже поработал в нескольких документах и форумах и знаю, что эта тема уже обсуждалась, но ни одно из предложенных решений не помогло мне решить мою проблему. Возможно дело в конфиге, поэтому я рассчитываю на вашу помощь, так как не знаю, что делать.
технический стек: PHP: 8.2 Симфония: 6.4 РеагироватьJs: 18,3
Моя потребность не сложная, пользователь нажимает на кнопку, чтобы отобразить все изображения, существующие на его диске и на общих дисках. Я использую React-Google-Drive-Picker и у меня есть доступ к нужным изображениям.
Если я использую file.id в почтальоне, чтобы получить файл и загрузить его на свой сервер, я всегда получаю сообщение об ошибке 404. Файл не найден, и я не знаю, почему.
Что я тестировал и не работает (всегда 404 не найден):
Любая помощь, пожалуйста?
Отображение изображений Google Grive: работает нормально.
import useDrivePicker from 'react-google-drive-picker';
export const Drive = () => {
const CLIENT_ID = "MY_CLIENT_ID";
const API_KEY = "API_KEY; // generated with Google Picker API in Google console not with Google Drive API
const [openPicker] = useDrivePicker();
const handleOpenPicker = () => {
openPicker({
clientId: CLIENT_ID,
developerKey: API_KEY,
viewId: "DOCS_IMAGES",
showUploadFolders: true,
supportDrives: true,
locale: 'fr',
// customScopes: ['https://www.googleapis.com/auth/drive'],
callbackFunction: (data) => {
if (data.action === 'cancel') {
console.info('User clicked cancel/close button')
}
if (data.docs) {
const file = data.docs[0];
console.info(file); // I can see my file object here
}
},
})
}
return (
<>
<button onClick = {() => handleOpenPicker()}>Open Picker</button>
</>
)
}
Получить файл с Google Диска с теми же учетными данными: не работает.
<?php
use Google\Client;
use Google\Service\Drive;
use Google\Service\Exception;
// ....
$request = json_decode($this->requestStack->getCurrentRequest()->getContent(), true);
$credentials = "../config/client_secret.json"; // I get this file when I created ID clients OAuth in Google console
$client = new Client();
$client->setAuthConfig($credentials);
$client->setDeveloperKey("SAME_API_KEY_FRONT_END");
$client->setClientId("SAME_CLIENT_ID_FRONT_END");
$client->addScope([Drive::DRIVE, Drive::DRIVE_FILE, Drive::DRIVE_METADATA, Drive::DRIVE_READONLY]);
$driveService = new Drive($client);
$response = $driveService->files->get($request["file"], [
'alt' => 'media',
'supportsAllDrives' => true
]
);
dd($response);





Моя ошибка, как я уже сказал, возможно, мне не хватает какой-то конфигурации.
Решение заключалось в том, чтобы создать службу учетной записи в консоли Google и обмениваться файлами с его адресом электронной почты.
Код, который работает
$request = json_decode($this->requestStack->getCurrentRequest()->getContent(), true);
// after created the account service, you will be able to download file like project-id-hash.json
$credentials = "PATH/TO/AUTH/FILE/GENERATED/IN/GOOGLE/CONSOLE";
$client = new Client();
$client->setAuthConfig($credentials);
$client->setDeveloperKey("API_KEY");
$client->setClientId("CLIENT_ID");
$client->addScope(Drive::DRIVE);
$driveService = new Drive($client);
$response = $driveService->files->get($request["file"], [
'alt' => 'media',
'supportsAllDrives' => true
]
);
if ($response->getStatusCode() === Response::HTTP_OK) {
$b64 = base64_encode($response->getBody()->getContents());
$filePath = $this->drive . $request["name"];
file_put_contents($filePath, base64_decode($b64));
}