29

Laravel 5.0 Storage ファサードを使用してアップロードされたファイルにメタデータまたはヘッダー (Expires、CacheControl など) を追加する方法を見つけようとしています。こちらのページを参考にさせていただきました。

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'));

ただし、「visibility」パラメーターを文字列から配列に変換できないというエラーが発生します。AwsS3Adapter のソースを確認したところ、オプションのコードがあるようですが、それらを正しく渡す方法がわかりません。以下が必要だと思います。

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

これを達成する方法についての助けをいただければ幸いです。

4

9 に答える 9

37

まず、getDriverオプションの配列を送信できるように呼び出す必要があります。そして、オプションを配列として送信する必要があります。

あなたの例では:

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

Cache-Control設定する場合は、として渡す必要があることに注意してくださいCacheControl。これは、英数字以外の文字を含む他のキーにも当てはまります。

于 2015-05-20T16:36:09.057 に答える
26

ヘッダーにグローバルなデフォルトを設定したい場合、これは 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']
],
于 2017-09-10T21:45:14.793 に答える
2

Laravel 9 ユーザーにとって、これはより簡単になりました。もう電話する必要はあり->getDriver()ません。コマンドにオプションを直接渡すことができますput

Storage::disk('s3')->put('/index.txt', 'file content', [
    // S3 Object ACL
    'visibility' => 'public', // or 'private',

    // HTTP Headers
    'CacheControl' => 'public,max-age=315360000',
    'ContentDisposition' => 'attachment; filename="index.txt"',
    'Expires' => 'Thu, 12 Feb 2032 08:24:43 GMT',

    // Metadata or other S3 options
    'MetadataDirective' => 'REPLACE'
    'Metadata' => [
        'Custom-Key' => 'test',
    ],
])

他のヘッダーやオプションが必要な場合は、flysystem のソース コードで利用可能なすべてのヘッダーとオプションを確認してください。

https://github.com/thephpleague/flysystem-aws-s3-v3/blob/master/src/AwsS3Adapter.php#L38

public const AVAILABLE_OPTIONS = [
    'ACL',
    'CacheControl',
    'ContentDisposition',
    'ContentEncoding',
    'ContentLength',
    'ContentType',
    'Expires',
    'GrantFullControl',
    'GrantRead',
    'GrantReadACP',
    'GrantWriteACP',
    'Metadata',
    'MetadataDirective',
    'RequestPayer',
    'SSECustomerAlgorithm',
    'SSECustomerKey',
    'SSECustomerKeyMD5',
    'SSEKMSKeyId',
    'ServerSideEncryption',
    'StorageClass',
    'Tagging',
    'WebsiteRedirectLocation',
];
于 2022-02-14T08:46:09.817 に答える
1

この問題を解決しました。カスタム S3 ファイルシステムを作成する必要があります

まず、新しいファイル CustomS3Filesystem.php を作成し、app/providers に保存します。このカスタム S3 ファイルシステムは S3 アダプターを使用しますが、メタデータとヘッダーを追加できます。

<?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()
{
    //
}
}

config/app.php のプロバイダー リストにプロバイダーを追加します。

'App\Providers\CustomS3Filesystem',

config/filesystems に新しいファイルシステム名を作成する

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

新しく作成されたカスタム s3 アダプターを使用する

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

laravel のドキュメントを使用して s3 アダプターをカスタマイズしました http://laravel.com/docs/5.0/filesystem#custom-filesystems

これがお役に立てば幸いです。

于 2015-05-15T22:48:43.707 に答える