使用 Laravel 5.0 存储外观将元数据、标头 (过期、缓存控制) 添加到上传到 Amazon S3 的文件

2022-08-30 15:04:02

我正在尝试了解如何将元数据或标头(Expires,CacheControl等)添加到使用Laravel 5.0存储外观上传的文件中。我在这里使用页面作为参考。

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

以下代码工作正常:

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

挖掘后,我还发现有一个“可见性”参数,它将ACL设置为“公共阅读”,因此以下内容也可以正常工作。

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

但我希望能够将其他一些值设置为文件的标头。我尝试了以下方法:

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

这不起作用,我也试过了:

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

但这会产生一个错误,其中“可见性”参数无法从字符串转换为数组。我已经检查了AwsS3Adapter的源代码,似乎有选项的代码,但我似乎看不到如何正确传递它们。我认为这需要以下几点:

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

任何关于如何实现这一目标的帮助将不胜感激。


答案 1

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

因此,对于您的示例:

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

请注意,如果要将其设置为 .,则必须将其传递为 。对于其他具有非字母数字字符的键,这很可能是正确的。Cache-ControlCacheControl


答案 2

如果你想使用带有标头的全局默认值,这在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']
],

推荐