Как исправить загрузку изображения на s3 с помощью Laravel - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь загрузить изображение на s3 с помощью Laravel, но получаю ошибку во время выполнения. Используя Laravel 5.8, PHP7 и API REST с Почтальоном, я отправляю телом base64 Я получаю изображение base64, и мне нужно загрузить его на s3 и получить URL-адрес запроса.

public function store(Request $request)
{
    $s3Client = new S3Client([
        'region' => 'us-east-2',
        'version' => 'latest',
        'credentials' => [
            'key' => $key,
            'secret' => $secret
        ]
    ]);
    $base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
    $image = base64_decode($base64_str);

    $result = $s3Client->putObject([
        'Bucket' => 's3-galgun',
        'Key' => 'saraza.jpg',
        'SourceFile' => $image
    ]);

    return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}

Говорит:

RuntimeException: невозможно открыть u Z f { z ڱ .......

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Параметр SourceFile ведет к пути файла для загрузки на S3, а не к двоичному

Вы можете использовать параметр Body для замены SourceFile или сохранения файла в локальном временном хранилище и получить путь для SourceFile Как это:

public function store(Request $request)
{
    $s3Client = new S3Client([
        'region' => 'us-east-2',
        'version' => 'latest',
        'credentials' => [
            'key' => $key,
            'secret' => $secret
        ]
    ]);
    $base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
    $image = base64_decode($base64_str);

    Storage::disk('local')->put("/temp/saraza.jpg", $image);

    $result = $s3Client->putObject([
        'Bucket' => 's3-galgun',
        'Key' => 'saraza.jpg',
        'SourceFile' => Storage::disk('local')->path('/temp/saraza.jpg')
    ]);

    Storage::delete('/temp/saraza.jpg');

    return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}

И, если вы используете S3 с Laravel, вам следует рассмотреть драйвер файловой системы S3 вместо того, чтобы обращаться к S3Client вручную в вашем контроллере

Для этого добавьте драйвер S3 composer require league/flysystem-aws-s3-v3, установите настройки S3 IAM в .env или config\filesystems.php

Затем обновите файловую систему по умолчанию в config\filesystems или укажите драйвер диска при использовании хранилища Storage::disk('s3')

Подробнее см. Документ здесь

0 голосов
/ 13 мая 2019

Вместо SourceFile вы должны использовать Body. SourceFile - это путь к файлу, но у вас нет файла, у вас есть источник img в кодировке base64. Вот почему вам нужно использовать Body, который может быть строкой. Подробнее здесь: https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject

Фиксированная версия:

public function store(Request $request)
{
    $s3Client = new S3Client([
        'region' => 'us-east-2',
        'version' => 'latest',
        'credentials' => [
            'key' => $key,
            'secret' => $secret
        ]
    ]);
    $base64_str = substr($input['base64'], strpos($input['base64'], ",") + 1);
    $image = base64_decode($base64_str);

    $result = $s3Client->putObject([
        'Bucket' => 's3-galgun',
        'Key' => 'saraza.jpg',
        'Body' => $image
    ]);

    return $this->sendResponse($result['ObjectURL'], 'message.', 'ObjectURL');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...