如何使用Laravel 5从Amazon S3下载文件


便捷的云存储

Laravel 5.2文件系统/云存储

现在可以获取本地公共文件。

1
Storage::disk('local')->get(public_path().'/ファイル名');

设置Amazon S3驱动程序

confgi下的filesystems.php中设置访问密钥和存储桶名称。
由于无法进行可靠的书写,请从.env获取它。

config \\ filesystems.php

1
2
3
4
5
6
7
8
9
10
11
'cloud' => 's3',

'disks' => [
    's3' => [
        'driver' => 's3',
        'key'    => env('S3_ACCESS_KEY'),
        'secret' => env('S3_SECRET_KEY'),
        'region' => env('S3_REGION'),
        'bucket' => env('S3_BUCKET'),
    ],
],

使用composer.json

安装软件包

在composer.json和composer update

中添加到require

composer.json

1
2
3
4
"require": {
    "aws/aws-sdk-php": "~3.0",
    "league/flysystem-aws-s3-v3": "~1.0",
}

将驱动程序设置为S3并尝试获取文件

SampleController

1
2
$file = Storage::disk('s3')->get('ファイルパス')
return response()->download($file);

结果:
is_file() expects parameter 1 to be a valid path, string given

可能是因为您试图下载文件内容的二进制字符串。

像这样

SampleController

1
2
3
4
5
6
7
8
9
10
$result = Storage::disk('s3')->getAdapter()->getClient()->getObject(['Bucket' => 'バケット名', 'Key' => 'キー']);
header('Content-Type: application/octet-stream');
$filename = '適当につけてください'
header("Content-Disposition: attachment; filename={$filename}");

// これで指定したファイル名で自動的にダウンロードされる
print($result['Body']);

// 画面遷移させない場合はnullを返しておく
return null;

补充①让我们检查是否存在

Storage::disk('s3')->exists('ファイル名')
它将返回为true / false。

补编(2)当您不知道要扩展的文件的扩展名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// これでMIMEが分かる
$contentType = $result['ContentType'];

// こんな感じで拡張子を返すメソッドを作っておくと便利
switch($contentType) {
    case 'image/png':
        return '.png';
    case 'image/jpeg':
        return '.jpg';
    case 'image/gif':
        return '.gif';
    case 'application/pdf':
        return '.pdf';
    default:
        return '.dat';
}

▼参考
扩展名(内容类型)列表
MIME类型列表

补充③以当前日期和时间作为文件名

下载

1
2
3
// 拡張子
$extension = '.png'
$filename = strftime('%Y%m%d%H%M%S').$extension

看起来像

20161027095602.png。