aws php amazon-s3 laravel-5 flysystem

php - aws - Agregue Metadatos, encabezados(Expires, CacheControl) a un archivo cargado en Amazon S3 usando la fachada de almacenamiento de Laravel 5.0



flysystem-aws-s3-v3 laravel (7)

Después de intentar las respuestas anteriores y de no poder agregar los metadatos de usuario del cliente, resulta que después de revisar el código del SDK es un poco más fácil de lo que pensaba (Asumir $path es una ruta a un archivo de imagen). Parece que tampoco tuve que llamar al método getDriver() , no estoy muy seguro de si eso hace alguna diferencia con la versión actual del SDK de AWS.

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

Así que ahora, si ve el archivo recién cargado en S3, verá los metadatos personalizados:

Espero que esto ayude a alguien.

Estoy intentando averiguar cómo agregar Metadatos o encabezados (Expires, CacheControl, etc.) a un archivo cargado utilizando la fachada de almacenamiento de Laravel 5.0. He usado la página aquí como referencia.

http://laravel.com/docs/5.0/filesystem

El siguiente código funciona correctamente:

Storage::disk(''s3'')->put(''/test.txt'', ''test'');

Después de excavar, también encontré que hay un parámetro de "visibilidad" que establece la ACL en "lectura pública", por lo que lo siguiente también funciona correctamente.

Storage::disk(''s3'')->put(''/test.txt'', ''test'', ''public'');

Pero me gustaría poder establecer algunos otros valores en el encabezado del archivo. He probado lo siguiente:

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

Lo que no funciona, también lo he intentado:

Storage::disk(''s3'')->put(''/index4.txt'', ''test'', array(''ACL''=>''public-read''));

Pero eso crea un error donde el parámetro ''visibilidad'' no se puede convertir de una cadena a una matriz. He comprobado la fuente de AwsS3Adapter y parece que hay código para las opciones, pero parece que no veo cómo pasarlas correctamente. Creo que toma lo siguiente:

protected static $metaOptions = [ ''CacheControl'', ''Expires'', ''StorageClass'', ''ServerSideEncryption'', ''Metadata'', ''ACL'', ''ContentType'', ''ContentDisposition'', ''ContentLanguage'', ''ContentEncoding'', ];

Cualquier ayuda sobre cómo lograr esto sería apreciada.


Estoy usando Laravel 4.2, pero creo que mi solución también podría ayudar en Laravel 5.0 (no puedo decirlo con seguridad, ya que todavía no he intentado actualizar). Debe actualizar las opciones de metadatos en la configuración del controlador de Flysystem que está utilizando. En mi caso, creé una conexión llamada s3static para acceder al depósito donde estoy almacenando imágenes que no cambiarán.

Mi archivo de configuración:

''s3static'' => [ ''driver'' => ''awss3'', ''key'' => ''my-key'', ''secret'' => ''my-secret'', ''bucket'' => ''my-bucket'', // ''region'' => ''your-region'', // ''base_url'' => ''your-url'', ''options'' => array( ''CacheControl'' => ''max_age=2592000'' ), // ''prefix'' => ''your-prefix'', // ''visibility'' => ''public'', // ''eventable'' => true, // ''cache'' => ''foo'' ],

Ahora cuando pongo cualquier archivo en S3 usando esta conexión, tienen el conjunto de metadatos de Cache-Control.


Hola, solucioné este problema, necesitas crear un sistema de archivos S3 personalizado

Primero, cree un nuevo archivo CustomS3Filesystem.php y guárdelo en la aplicación / proveedores, este sistema de archivos S3 personalizado utiliza el Adaptador S3, pero puede agregar metadatos y encabezados.

<?php namespace App/Providers; use Storage; use League/Flysystem/Filesystem; use Aws/S3/S3Client; use League/Flysystem/AwsS3v2/AwsS3Adapter as S3Adapter; use Illuminate/Support/ServiceProvider; class CustomS3Filesystem extends ServiceProvider { public function boot() { Storage::extend(''s3_custom'', function($app, $config) { $s3Config = array_only($config, [''key'', ''region'', ''secret'', ''signature'', ''base_url'']); $flysystemConfig = [''mimetype'' => ''text/xml'']; $metadata[''cache_control'']=''max-age=0, no-cache, no-store, must-revalidate''; return new Filesystem(new S3Adapter(S3Client::factory($s3Config), $config[''bucket''], null, [''mimetype'' => ''text/xml'', ''Metadata'' => $metadata]), $flysystemConfig); }); } public function register() { // } }

Agregar proveedor a la lista de proveedores en config / app.php

''App/Providers/CustomS3Filesystem'',

Crear nuevo nombre de archivo en config / filesystems

''s3-new'' => [ ''driver'' => ''s3_custom'', ''key'' => ''XXX'', ''secret'' => ''XXX'', ''bucket'' => ''XXX'', ],

Utilice el nuevo adaptador s3 personalizado creado

Storage::disk(''s3-new'')->put(filename, file_get_contents($file), public);

Usé la documentación de laravel para personalizar el adaptador s3 http://laravel.com/docs/5.0/filesystem#custom-filesystems

Espero que esto te pueda ayudar.


La respuesta de @Paras es buena. Pero hay una cosa que puede confundir a los recién llegados:

''options'' => [ ''Expires'' => gmdate(''D, d M Y H:i:s GMT'', strtotime(''+1 month'')), >>> WRONG visibility'' => ''public'', WRONG <<< ]

Si desea definir opciones globales para los HEADERS, la matriz de opciones es el camino correcto. Pero si también desea definir la visibilidad, no puede mezclarla. La visibilidad debe ser definida fuera de la matriz de opciones.

👍

''visibility'' => ''public'', ''options'' => [''Expires'' => gmdate(''D, d M Y H:i:s GMT'', strtotime(''+1 month''))]


Para ampliar la respuesta de @sergiodebcn, aquí está la misma clase CustomS3Filesystem que trabaja para S3 v3 y el último Laravel. Nota, he eliminado el mimetype XML y configuré un tiempo de caché de 5 días:

namespace App/Providers; use Illuminate/Support/Arr; use Storage; use League/Flysystem/Filesystem; use Aws/S3/S3Client; use League/Flysystem/AwsS3v3/AwsS3Adapter as S3Adapter; use Illuminate/Support/ServiceProvider; class CustomS3Filesystem extends ServiceProvider { /** * Format the given S3 configuration with the default options. * * @param array $config * @return array */ protected function formatS3Config(array $config) { $config += [''version'' => ''latest'']; if ($config[''key''] && $config[''secret'']) { $config[''credentials''] = Arr::only($config, [''key'', ''secret'']); } return $config; } /** * Bootstrap a custom filesystem * * @return void */ public function boot() { Storage::extend(''s3_custom'', function($app, $config) { $s3Config = $this->formatS3Config($config); return new Filesystem( new S3Adapter( new S3Client($s3Config), $config[''bucket''], null, [ ''CacheControl'' => ''max-age=432000'' ] ) ); }); } public function register() { // } }


Primero, debe llamar a getDriver para que pueda enviar una serie de opciones. Y luego necesitas enviar las opciones como una matriz.

Así que para su ejemplo:

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

Tenga en cuenta que si está configurando ''Cache-Control'', debe pasarse como ''CacheControl''. Esto puede ser cierto para otras teclas con caracteres no alfanuméricos.


Si desea tener valores predeterminados globales con encabezados, esto funciona en Laravel 5.4. Cambie su archivo config/filesystems.php manera:

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