在Laravel中本地下载AWS S3存储桶

I have a task of pulling down assets which are stored on an AWS S3 bucket and storing those in a local project using Laravel. Also, the files are encrypted.

I need to write a script to do this.

Any ideas on how to do this?

Assuming you have following disks :

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

    's3' => [
        'driver' => 's3',
        'key' => env('S3_KEY'),
        'secret' => env('S3_SECRET'),
        'region' => env('S3_REGION'),
        'bucket' => env('S3_BUCKET'),
        'http'    => [
            'connect_timeout' => 30,
        ],
    ],

],

Then you can copy file using :

if(Storage::disk('s3')->exists('path/yourfile.txt')){

    Storage::disk('local')->writeStream('path/yourfile.txt', Storage::disk('s3')->readStream('path/yourfile.txt'));
}

To move the file :

if(Storage::disk('s3')->exists('path/yourfile.txt')){

    Storage::disk('local')->writeStream('path/yourfile.txt', Storage::disk('s3')->readStream('path/yourfile.txt'));

    Storage::disk('s3')->delete('path/yourfile.txt');
}

If you have set default disk then you can skip mentioning it spefically and directly do Storage::something()

Moving all files from s3 to local disk :

Considering you have different disks which are not on the same server, you need to do little bit extra as compared to both disks on the same server :

$s3Files = Storage::disk('s3')->allFiles();
foreach ($s3Files as $file) {

    // copy
    Storage::disk('local')->writeStream($file, Storage::disk('s3')->readStream($file));

    // move
    Storage::disk('local')->writeStream($file, Storage::disk('s3')->readStream($file));
    Storage::disk('s3')->delete($file);
}

Or You can move the delete() after the entire moving and delete all files together like :

Storage::disk('s3')->delete(Storage::disk('s3')->allFiles());

which is essentially similar but just one function call.