クラウドストレージが便利
Laravel 5.2 ファイルシステム/クラウドストレージ
ローカルのpublic下にあるファイルはこれで取得できる。
Storage::disk('local')->get(public_path().'/ファイル名');
Amazon S3のドライバを設定する
confgi下のfilesystems.phpにアクセスキーやバケット名を設定する。
ベタ書きはありえないので.envから取得する。
config\filesystems.php
'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のrequireに追加してcomposer update
する
composer.json
"require": {
"aws/aws-sdk-php": "~3.0",
"league/flysystem-aws-s3-v3": "~1.0",
}
ドライバをS3にしてファイル取得してみる
SampleController
$file = Storage::disk('s3')->get('ファイルパス')
return response()->download($file);
結果:
is_file() expects parameter 1 to be a valid path, string given
ファイルの内容のバイナリ文字列をダウンロードしようとしてるためと思われる。
こうしたらできた
SampleController
$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で返ってきます。
補足② 取得したいファイルの拡張子が分からないとき
// これで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';
}
▼参考
拡張子(Content-type)一覧
MIMEタイプ一覧
補足③ 現在日時をファイル名にしてダウンロードする
// 拡張子
$extension = '.png'
$filename = strftime('%Y%m%d%H%M%S').$extension
20161027095602.png みたいになる。