21
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel5でAmazon S3からファイルをダウンロードする方法

Posted at

クラウドストレージが便利

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 みたいになる。

21
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?