Как исправить загрузку изображения на s3 с помощью Laravel

Я пытаюсь загрузить изображение на s3 с помощью Laravel, но получаю ошибку времени выполнения. Используя Laravel 5.8, PHP7 и API REST с Postman, я отправляю телом 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: Unable to open u�Z�f�{��zڱ��� .......

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 706
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вместо 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');
}

Параметр 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')

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

Очень простой способ загружает любой файл в хранилище AWS-S3.

Во-первых, проверьте настройки ENV.

AWS_ACCESS_KEY_ID=your key
AWS_SECRET_ACCESS_KEY= your access key
AWS_DEFAULT_REGION=ap-south-1
AWS_BUCKET=your bucket name
AWS_URL=Your URL

Второй FileStorage.php

  's3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
        'url' => env('AWS_URL'),
        //'visibility' => 'public', // do not use this line for security purpose. try to make bucket private.
    ],

Теперь приступайте к основному коду. Загрузить бинарный файл из HTML-формы.

 $fileName = 'sh_'.mt_rand(11111,9999).".".$imageFile->clientExtension();;
 $s3path  =  "/uploads/".$this::$SchoolCode."/";
 Storage::disk('s3')->put($s3path, file_get_contents($req->file('userDoc')));

Upload Base64 FileFor Public Bucket or if you want to keep file Public

 $binary_data = base64_decode($file);
 Storage::disk('s3')->put($s3Path, $binary_data, 'public');

For Private Bucket or if you want to keep file Private

   $binary_data = base64_decode($file);
   Storage::disk('s3')->put($s3Path, $binary_data);

Я рекомендую вам сохранить ваш файл в секрете... это более безопасный способ и безопасный. для этого вы должны использовать PreSign в URL-адресе для доступа к этому файлу.

Для URL-адрес для входа перед входом проверьте этот пост. Как получить доступ к изображению в ведре s3, используя предварительно подписанный URL-адрес

'видимость' => 'общедоступность', требуется. если кто забудет, то добавьте, что иначе вы не можете получить ни один загруженный файл.

pankaj kumar 16.05.2020 10:05

'visibility' => 'public', требуется в случае, если сделать файл общедоступным, иначе вы можете оставить его. перед этим вы должны сначала проверить характер вашего ведра.

pankaj kumar 31.07.2020 10:06

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