Как загрузить файлы в облачное хранилище Google из приложения Laravel

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

Облачное хранилище позволяет хранить и извлекать любой объем данных по всему миру в любое время. Вы можете использовать облачное хранилище для целого ряда сценариев, включая обслуживание контента веб-сайта, хранение данных для архивирования и аварийного восстановления или распространение больших объектов данных среди пользователей посредством прямой загрузки.

Файлы хранятся в корзинах в облачном хранилище Google.

Преимущества использования облачного управления цифровыми активами

  • Организация файлов
  • Легко оптимизируется
  • Делает приложение быстрее
  • Облегчает совместную работу в команде
  • Минимизируйте риск потери медиафайлов

Начнем с нового приложения Laravel

laravel new laravel_upload_using_google_cloud_storage

OR

composer create-project laravel/laravel_upload_using_google_cloud_storage

После успешной установки измените каталог на laravel_upload_using_google_cloud_storage

cd laravel_upload_using_google_cloud_storage

Давайте обслуживать приложение на порту 8001, используя флаг порта.

Мы будем использовать эту статью Полная аутентификация Laravel 8 с использованием Laravel Fortify и Bootstrap 4 для настройки аутентификации приложения.

Для этого руководства мы остановимся на разделе входа и регистрации упомянутой выше статьи.

Далее добавьте дополнительный столбец в таблицу пользователей

Затем установите переменную среды для этого приложения в файле .env

DB_CONNECTION=mysql 
DB_HOST=127.0.0.1 
DB_PORT=3306 
DB_DATABASE=laravel_upload_using_google_cloud_storage DB_USERNAME=root 
DB_PASSWORD= 

Далее запустите команду переноса

Далее создайте контроллер загрузки для управления загрузкой изображений для пользователей

php artisan make:controller UploadController

Добавьте два метода для обработки отображения формы загрузки файла и сохранения данных

public function upload()
    {}
public function store(Request $request)
    {}

Добавить маршрутизацию в файл web.php

Route::middleware(['auth'])->group(function () {
    Route::get('/home', [UploadController::class, 'upload'])->name('home');
    Route::post('uploads/store', [UploadController::class, 'store'])->name('uploads.store');
});

Далее создайте представления для входа, регистрации и форму для загрузки изображения профиля

Представления для этого туториала доступны в этом репозитории здесь

Далее создайте новый проект в google console

Нажмите кнопку нового проекта

Далее введите предпочтительные данные для проекта

После создания проекта подробности отображаются на панели управления

Project info 
Project name Laravel upload 
Project number 1549378xxxxx 
Project ID laravel-upload-98xxxx 

Далее создайте учетную запись службы для этого проекта, чтобы получить файл учетных данных в формате JSON

Нажмите на панель навигации и наведите указатель мыши на IAM $ Admin, затем нажмите на сервисные аккаунты.

Нажмите создать сервисный аккаунт, чтобы добавить сервисный аккаунт для созданного проекта

Заполните данные сервисного аккаунта

Нажмите создать и продолжить.

Далее выберите роль администратора хранилища и нажмите "Продолжить"

Если вы хотите предоставить пользователям доступ, вы можете сделать это здесь, но это необязательно

Далее нажмите на созданную службу и перейдите в раздел вкладки ключей, чтобы получить доступ к загрузке файла json

Нажмите, чтобы создать новый

Затем нажмите создать, и он автоматически загрузит файл json на ваш компьютер.

Пожалуйста, держите этот json-файл или учетные данные в секрете или git игнорирует файл, чтобы он не попадал в системы контроля версий

Далее давайте перейдем к аспектам облачного хранилища Google

Нажмите [облачное хранилище] (cloud.google.com/storage/docs)

Вы можете нажать на опцию хранения на панели управления проекта.

или используйте меню навигации, как показано на изображении ниже, затем нажмите на браузер

Далее нажмите "Создать сегмент" и введите требуемые данные

Вы можете выбрать любой регион по вашему выбору, но несколько регионов дороже, чем один регион.

Далее выберите детальный вариант

Укажите доступ к отдельным объектам, используя разрешения на уровне объекта (ACL) в дополнение к вашим разрешениям на уровне сегмента (IAM). Подробнее о Списке контроля доступа

Потрясающий!!!

Затем создайте папку laravel-upload, чтобы содержимое было организовано

Затем установите переменную среды для облачного хранилища в файле .env

GOOGLE_CLOUD_PROJECT_ID=laravel_upload_using_google_cloud_storage 
GOOGLE_CLOUD_STORAGE_BUCKET=laravel-upload-gcs 

Затем переместите загруженный файл json в папку config/, а также создайте файл googlecloud.php в той же папке

Вот как должен выглядеть googlecloud.php

return [ 'project_id' => env('GOOGLE_CLOUD_PROJECT_ID'), 'storage_bucket' => env('GOOGLE_CLOUD_STORAGE_BUCKET'), ]; 

Далее интегрируйте пакет cloud-storage

composer require google/cloud-storage

Далее выполните приведенные ниже команды

composer dump-autoload 

php artisan optimize:clear

Далее импортируйте пакет на контроллер, в нашем случае UploadController.

use Google\Cloud\Storage\StorageClient; 

Вот метод загрузки файла в облачное хранилище Google

public function store(Request $request)
    {
//validate the file upload
        $request->validate([
            'avatar' => 'required|image|max:10240',
        ]);
//get the authenticated user
        $user = Auth::user();
//get the credentials in the json file
        $googleConfigFile = file_get_contents(config_path('laravel-project.json'));
//create a StorageClient object
        $storage = new StorageClient([
            'keyFile' => json_decode($googleConfigFile, true)
        ]);
//get the bucket name from the env file
        $storageBucketName = config('googlecloud.storage_bucket');
//pass in the bucket name
        $bucket = $storage->bucket($storageBucketName);
$avatar_request = $request->file('avatar');
$image_path = $avatar_request->getRealPath();
//rename the file
        $avatar_name = $user->name.'-'.time().'.'.$avatar_request->extension();
//open the file using fopen
        $fileSource = fopen($image_path, 'r');
//specify the path to the folder and sub-folder where needed
        $googleCloudStoragePath = 'laravel-upload/' . $avatar_name;
//Delete previously uploaded image to cloud storage by this user
        if(Auth::user()->avatar !== ''){
            $object = $bucket->object('laravel-upload/'.Auth::user()->avatar );
            $object->delete();
        };
//upload the new file to google cloud storage 
        $bucket->upload($fileSource, [
            'predefinedAcl' => 'publicRead',
            'name' => $googleCloudStoragePath
        ]);
//pass in the name of the file and save
        $user->avatar = $avatar_name ;
        $user->save();
//return a success message to the user
        return redirect()->route('home')
                        ->with('success','Uploaded successfully.');
    }

//Тот же подход применим к загрузке файлов PDF.

Дополнительные функции см. здесь

Затем добавьте метод получения аватара в модель пользователя, чтобы добавить URL-адрес к изображению в облачном хранилище

//laravel 9
public function avatar(): Attribute
    {
        return new Attribute(
            get: fn ($value) => 'https://storage.googleapis.com/laravel-upload-gcs/laravel-upload/'.$value,
        );
    }

Далее обновите браузер, нажмите на главную и загрузите изображение

Отлично!!! После загрузки файла вот результат

В облачном хранилище Google

Кредиты исследования статьи

- [GoogleCloudPlatform/php-docs-samples](https://github.com/GoogleCloudPlatform/php-docs-samples)
- [Aghwotu Ovuoke](https://dev.to/ediri_aghwotu/ как-загружать-файлы-в-облако-google-используя-laravel-3618)

Спасибо, что прочитали эту статью.

Пожалуйста, поделитесь со своей сетью и не стесняйтесь использовать раздел комментариев для вопросов, ответов и предложений.

Вам нравится эта статья?? пожалуйста, следуйте за мной на Hashnode alemsbaja или Twitter @alemsbaja, чтобы оставаться в курсе новых статей

Первоначально опубликовано на https://alemsbaja.hashnode.dev.