Visibilidad publica de archivos con Laravel y S3

Spread the love

De forma predeterminada amazon S3 almacena los archivos de forma privada lo que evita que puedas acceder a esos recursos mediante una url.

Cambiar este comportamiento es muy sencillo en Laravel.

Así que fácilmente puedes hacer algo como lo siguiente.

$path = Storage::disk('s3')->1putFileAs(
    'avatars', $request->file('avatar'), $filename, 'public'
);

Y esto esta muy bien, pero que pasa si requerimos que todos los archivos que se almacenen sean públicos.

Para este tipo de casos Laravel es increíblemente conveniente y a veces pareciera que ya esta todo pensado.

Almacenamiento publico mediante configuración

Si requiere que los archivos se almacenen con permisos públicos puedes hacer uso de la configuración del driver de s3.

'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',
        ],

Como habrás notado agregamos un key adicional visibility con el valor public. De esta forma ahora los archivos que almacenemos tendrán permisos públicos.

$path = Storage::disk('s3')->1putFileAs(
    $storagePath, $request->file('avatar'), $filename
);

También puede hacer uso de Request y acceder a la clase UploadedFile.

$path = $request->file('avatar')->storeAs(
    $storagePath, $filename, 's3'
);

Utiliza Publicly para almacenar de forma publica

Si no requieres que todos tus archivos se almacenen de forma publica, puedes hacer uso del método storePublicly, que a pesar de estar disponible desde la versión 5.3 de Laravel he visto que no se emplea mucho.

$path = $request->file('avatar')->storePubliclyAs(
    $storagePath, $filename, 's3'
);

Como puedes apreciar, Laravel cuanta siempre con varias opciones para realizar la misma tarea. Así que depende de ti decidir que opción se acomoda mas a tus necesidades.