Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Приветствую всех.
Есть проект на Laravel 5.5, файлы лежат на AWS S3. Файлы успешно загружаются, удаляются, читаются и т.п. Но столкнулся с проблемой при их "перемещении". В результате выяснил, что копирование тоже не работает
Функции Storage::copy() и Storage::move() просто не отрабатывают, при if(Storage::move()) возвращают false. Если переключить хранилище на local, то все отрабатывает корректно.
Никто не сталкивался с пободным?
Буду благодарен за любые советы.
Не в сети
Всем спасибо, проблему нашел
Не в сети
Всем спасибо, проблему нашел
В таких случаях принято писать решение, потому что в будущем твой ответ может кому-нибудь помочь.
Не в сети
Приветствую.
В таких случаях принято писать решение, потому что в будущем твой ответ может кому-нибудь помочь.
Вчера замотался и сил уже не было. Попробую описать ситуацию максимально подробнее, возможно кто-то укажет на мои ошибки в решение данной задачи или это поможет другим в будущем.
Использовать 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().
Не в сети