Add Metadata, headers (Expires, CacheControl) to a file uploaded to Amazon S3 using the Laravel 5.0 Storage facade Add Metadata, headers (Expires, CacheControl) to a file uploaded to Amazon S3 using the Laravel 5.0 Storage facade php php

Add Metadata, headers (Expires, CacheControl) to a file uploaded to Amazon S3 using the Laravel 5.0 Storage facade


First, you need to call getDriver so you can send over an array of options. And then you need to send the options as an array.

So for your example:

Storage::disk('s3')->getDriver()->put('/index4.txt', 'test', [ 'visibility' => 'public', 'Expires' => 'Expires, Fri, 30 Oct 1998 14:19:41 GMT']);

Be aware that if you're setting Cache-Control it has to be passed as CacheControl. This may well be true for other keys with non-alphanumierc characters.


If you want to have global defaults with headers, this works in Laravel 5.4. Change your config/filesystems.php file like so:

s3' => [    'driver' => 's3',    'key' => env('AWS_KEY'),    'secret' => env('AWS_SECRET'),    'region' => env('AWS_REGION'),    'bucket' => env('AWS_BUCKET'),    'options' => ['CacheControl' => 'max-age=315360000, no-transform, public',                   'ContentEncoding' => 'gzip']],


After attempting the above answers and failing to be able to add customer user-metadata it turns out that after digging through the SDK code it is a bit easier than I thought (Assume $path is a path to an image file). I didn't appear to need to call the getDriver() method either, not too sure if that makes any difference with the current version of the AWS SDK.

Storage::put(    'image.jpg',    file_get_contents($path),    [        'visibility' => 'public',        'Metadata' => [            'thumb' => '320-180',        ],    ]);

So now if you view the newly uploaded file in S3 you will see the custom metadata:

enter image description here

Hope this helps someone.