使用Laravel 5.0 Storage Facade将元数据,标题(Expires,CacheControl)添加到上传到Amazon S3的文件中

ale*_*ane 22 php amazon-s3 laravel-5 flysystem

我试图找出如何将元数据或标题(Expires,CacheControl等)添加到使用Laravel 5.0存储外观上传的文件中.我在这里使用这个页面作为参考.

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

以下代码正常工作:

Storage::disk('s3')->put('/test.txt', 'test');
Run Code Online (Sandbox Code Playgroud)

在挖掘之后我还发现有一个'visibility'参数可以将ACL设置为'public-read',因此以下内容也可以正常工作.

Storage::disk('s3')->put('/test.txt', 'test', 'public');
Run Code Online (Sandbox Code Playgroud)

但我希望能够为文件的标题设置一些其他值.我尝试过以下方法:

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

哪个不起作用,我也尝试过:

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

但是这会产生一个错误,其中'visibility'参数无法从字符串转换为数组.我检查了AwsS3Adapter的来源,似乎有选项代码,但我似乎无法看到如何正确传递它们.我认为它需要以下内容:

protected static $metaOptions = [
    'CacheControl',
    'Expires',
    'StorageClass',
    'ServerSideEncryption',
    'Metadata',
    'ACL',
    'ContentType',
    'ContentDisposition',
    'ContentLanguage',
    'ContentEncoding',
];
Run Code Online (Sandbox Code Playgroud)

任何有关如何实现这一点的帮助将不胜感激.

Mat*_*ald 26

首先,您需要调用getDriver,以便发送一系列选项.然后你需要将选项作为数组发送.

所以对于你的例子:

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

请注意,如果您正在设置"Cache-Control",则必须将其作为"CacheControl"传递.对于具有非alphanumierc字符的其他键,这可能是正确的.

  • 这对我很有用.谢谢! (2认同)

Par*_*ras 19

如果您想要包含标题的全局默认值,则可以在Laravel 5.4中使用.config/filesystems.php像这样更改文件:

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']
],
Run Code Online (Sandbox Code Playgroud)

  • 感谢这一点,我认为它可能已被否决,因为这是一个全局解决方案,而不是每个文件/上传解决方案。您可能不想在全局级别进行设置。我问问题的时候并没有。 (2认同)

Xan*_*anT 7

在尝试上述答案并且无法添加客户用户元数据后,事实证明在挖掘 SDK 代码后,它比我想象的要容易一些(假设$path是图像文件的路径)。我似乎也不需要调用该getDriver()方法,不太确定这与当前版本的 AWS SDK 是否有任何区别。

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

所以现在如果您在 S3 中查看新上传的文件,您将看到自定义元数据:

在此处输入图片说明

希望这可以帮助某人。