2016-03-22 18 views
9

私はamazon s3から署名されたURLを取得するための良い解決策を探しています。ファイルシステムLaravel 5.2を使用してamazon s3からファイルの署名付きURLを取得します。

私はそれで作業バージョンを持っていますが、laravelを使用していない:

private function getUrl() 
{ 
     $distribution = $_SERVER["AWS_CDN_URL"]; 

     $cf = Amazon::getCFClient(); 

     $url = $cf->getSignedUrl(array(
      'url'  => $distribution . self::AWS_PATH.rawurlencode($this->fileName), 
      'expires' => time() + (session_cache_expire() * 60))); 

     return $url; 
} 

これはlaravelで行うための最善の方法である場合、私はそれが動作するように、ファイルシステム全体を持って考えると、わかりません。 ..

しかし、別の方法がない場合、どのようにクライアントを取得できますか?私はあなたがあまりにもflysystem作曲パッケージのAWSを持っていることを確認してくださいファイルシステムオブジェクト内のそれのインスタンスを見つけたが、それが保護されている... Laravelで

+0

あなたはありがとう、私はそれを試してみましょうS3 https://laravel.com/docs/5.5/filesystem#file-urls –

答えて

30

$s3 = \Storage::disk('s3'); 
$client = $s3->getDriver()->getAdapter()->getClient(); 
$expiry = "+10 minutes"; 

$command = $client->getCommand('GetObject', [ 
    'Bucket' => \Config::get('filesystems.disks.s3.bucket'), 
    'Key' => "file/in/s3/bucket" 
]); 

$request = $client->createPresignedRequest($command, $expiry); 

return (string) $request->getUri(); 

デバッグ(バージョンが異なります):Laravel 5.5の場合

"league/flysystem-aws-s3-v3": "1.0.9" 
+0

で使用できる 'temporaryUrl'の方法があります! –

+4

このコード(またはその危険な近いバージョン)が[this pull](https://github.com/laravel/framework/pull/20375/files)の時点でLaravelの一部になっています。ドキュメントは(https://laravel.com/docs/5.5/filesystem#file-visibility)(同様に ':: temporaryUrl'を探してください)。 – Theson

4

とアップ、あなたは今URLをpresigned一時的なURLの/ S3を使用することができます 。

use \Storage; 

// Make sure you have s3 as your disk driver 
$url = Storage::disk('s3')->temporaryUrl(
    'file1.jpg', Carbon::now()->addMinutes(5) 
); 

これは、s3ストレージドライバAFAIKでのみ機能します。 Laravel 5.5で

https://laravel.com/docs/5.5/filesystem#retrieving-files

+1

これは素晴らしいですが、 "このドライバは一時URLの作成をサポートしていません"という例外を避けるために、ストレージがS3であることを指定しなければなりませんでした。例えば、 '$ url = Storage :: disk( 's3') - > temporaryUrl(...);'となります。 – pnairn

+0

また、@ pnairnのおかげで例外を避けるために 's3'を指定する必要がありました – Ehsan

+0

s3ファイルでCloudFrontを使用する場合、どうすればいいですか?上記の方法でS3の署名付きURLを生成することはできましたが、クラウドフロントURLを使用したいと思います。これは可能ですか? – Justin

関連する問題