Загрузка на S3 из Laravel Quality Lost

Мое приложение загружает изображения на s3. Я использую интерфейсный рендеринг, чтобы получить цвета изображения, но поскольку загрузка в s3 снижает качество (jpeg'ish), я получаю больше цветов, чем нужно.

enter image description here

$s3 = \Storage::disk('s3');
$s3->put('/images/file.jpg', '/images/file.jpg', 'public');

Есть ли способ предотвратить эту потерю качества? Я заметил, что если я загружаю файл напрямую с помощью веб-сайта консоли aws, качество остается неизменным, что является идеальным.

Спасибо!

Ответ 1

В контроллере Action

public function uploadFileToS3(Request $request)
{
    $image = $request->file('image');
} 

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

$imageFileName = time() . '.' . $image->getClientOriginalExtension();

Теперь получите содержимое изображения следующим образом

$s3 = \Storage::disk('s3');
$filePath = '/images/file.jpg' . $imageFileName;
$s3->put($filePath, file_get_contents($image), 'public');

Для получения дополнительной информации вы можете обратиться к этому

Ответ 2

Я не знаком с Laravel, но знаком с AWS S3, и я использую aws-sdk-php.
Насколько я знаю, ни AWS S3, ни php-sdk не делают ничего неявно под капотом. Поэтому в вашем проекте должно быть что-то не так.
Вы можете попробовать использовать простой aws-sdk-php:

$s3 = S3Client::factory([
    'region'      => 'us-west-2',
    'credentials' => $credentials,
    'version'     => 'latest',
]);
$s3->putObject([
    'Bucket'     => 'myBucket',
    'Key'        => 'test/img.jpg',
    'SourceFile' => '/tmp/img.jpg',
]);

Он отлично работает.