Загрузите файл Google Диска с помощью PHP Symfony

Я уже поработал в нескольких документах и ​​форумах и знаю, что эта тема уже обсуждалась, но ни одно из предложенных решений не помогло мне решить мою проблему. Возможно дело в конфиге, поэтому я рассчитываю на вашу помощь, так как не знаю, что делать.

технический стек: PHP: 8.2 Симфония: 6.4 РеагироватьJs: 18,3

Моя потребность не сложная, пользователь нажимает на кнопку, чтобы отобразить все изображения, существующие на его диске и на общих дисках. Я использую React-Google-Drive-Picker и у меня есть доступ к нужным изображениям.

Если я использую file.id в почтальоне, чтобы получить файл и загрузить его на свой сервер, я всегда получаю сообщение об ошибке 404. Файл не найден, и я не знаю, почему.

Что я тестировал и не работает (всегда 404 не найден):

  • Файл, созданный мной на моем диске
  • Файл, созданный мной на общем диске
  • Файл, созданный не мной на общем диске
  • Все области в $client->addScope ; все вместе и по отдельности
  • У учетной записи, использующей эти файлы, обычно есть разрешения на загрузку файлов (особенно файла, созданного мной на моем диске).

Любая помощь, пожалуйста?

Отображение изображений 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);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Моя ошибка, как я уже сказал, возможно, мне не хватает какой-то конфигурации.

Решение заключалось в том, чтобы создать службу учетной записи в консоли 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));
    }

  

Другие вопросы по теме