Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Не работает Storage::copy() и Storage::move() с AWS S3 » 10.11.2017 10:23:04

Приветствую.

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

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

Использовать AWS S3 я решил не от Амазона, а от mail.ru. Готовых решений я не нашел и не нашел возможности указать адрес сервера (вместо амазона) в предоставляемом драйвере.

Установил компонент league/flysystem-aws-s3-v3. Далее сделал свой сервис провайдер: BizmrgServiceProvider

<?php

namespace App\Providers;

use Storage;
use League\Flysystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use Aws\S3\S3Client;
use App\Helpers\AwsS3Adapter;

class BizmrgServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        Storage::extend('bizmrg', function ($app, $config) {
            
            $client = new S3Client([
                'version'     => 'latest',
                'region'      => 'us-west-2',
                'credentials' => [
                    'key'    => env('AWS_KEY'),
                    'secret' => env('AWS_SECRET'),
                ],
                'endpoint' => 'https://' . env('AWS_ENDPOINT')
            ]);

            $bucket = env('AWS_BUCKET');
            
            return new Filesystem(new AwsS3Adapter($client, $bucket));
        });

    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

В config/app.conf зарегистрировал сервис провайдер:

'providers' => [
****
App\Providers\BizmrgServiceProvider::class,
],

В config/filesystem.php:

'default' => 'bizmrg',

В .env:

AWS_ENDPOINT=hb.bizmrg.com
AWS_KEY=*****
AWS_SECRET=*****
AWS_BUCKET=storage.bucket

Вот тут мне пришлось дополнительно копировать AwsS3Adapter, т.к. описанная выше ошибка была связана с функцией copy(). А именно:

'CopySource' => urlencode($this->bucket . '/' . $this->applyPathPrefix($path)),

В итоге я получал ошибку:

Error executing "CopyObject" on "https://hb.bizmrg.com/storage.bucket/im … va/001.jpg"; AWS HTTP error: Client error: `PUT https://hb.bizmrg.com/storage.bucket/images/originals/Proverka-dva/001.jpg` resulted in a `412 Precondition Failed` response:
<?xml version="1.0" encoding="utf-8"?>
<Error><Code>BadCopySource</Code><AWSAccessKeyId>***</AWSAcces (truncated...)
BadCopySource (client): The x-amz-copy-source headers doesnt match - <?xml version="1.0" encoding="utf-8"?>
<Error><Code>BadCopySource</Code><AWSAccessKeyId>***</AWSAccessKeyId><RequestId>****</RequestId><Message>The x-amz-copy-source headers doesnt match</Message></Error>

Т.к. CopySource содержал путь, в котором все / были заменены на %2F.

Скопировав адаптер в App\Helpers\AwsS3Adapter изменил строку убрав функцию urlencode().

#3 Laravel 5.x » Не работает Storage::copy() и Storage::move() с AWS S3 » 09.11.2017 09:42:10

DasIsGood
Ответов: 3

Приветствую всех.

Есть проект на Laravel 5.5, файлы лежат на AWS S3. Файлы успешно загружаются, удаляются, читаются и т.п. Но столкнулся с проблемой при их "перемещении". В результате выяснил, что копирование тоже не работает sad

Функции Storage::copy() и Storage::move() просто не отрабатывают, при if(Storage::move()) возвращают false. Если переключить хранилище на local, то все отрабатывает корректно.

Никто не сталкивался с пободным?

Буду благодарен за любые советы.

Подвал раздела