2016-03-22 10 views
9

Szukam dobrego rozwiązania, aby uzyskać podpisany adres URL od amazon s3.Pobierz podpisany adres URL pliku od amazon s3 przy użyciu systemu plików Laravel 5.2

Mam wersję pracy z nim, ale nie za pomocą 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; 
} 

Nie wiem, czy jest to najlepszy sposób, żeby zrobić z laravel, biorąc pod uwagę, że ma cały system plików do pracy. ..

Ale jeśli nie masz innego sposobu, w jaki sposób mogę uzyskać klienta? Debugowania Znalazłem instancję go wewnątrz obiektu systemu plików, ale jest on chroniony ...

+0

W laravel 5.5 jest 'metoda temporaryUrl' można korzystać z S3 https://laravel.com/docs/5.5/filesystem#file-urls –

Odpowiedz

30

W laravel,

$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(); 

Upewnij się, że AWS pakietu flysystem kompozytora też (wersja będzie się zmieniać):

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

Dziękuję, będę go wypróbować! –

+4

Widzę, że ten kod (lub jego niebezpiecznie bliska wersja) jest teraz częścią Laravel z [tego pull] (https://github.com/laravel/framework/pull/20375/files). Dokumentacja też [także] (https://laravel.com/docs/5.5/filesystem#file-visibility) (poszukaj ':: temporaryUrl'). – Theson

4

Dla laravel 5.5 iw górę, można teraz używać tymczasowe adresy URL/s3 presigned URL.

use \Storage; 

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

Działa to tylko w przypadku sterownika A3IK do przechowywania danych S3.

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

+1

To jest świetne, ale musiałem określić, że pamięć była S3, aby uniknąć wyjątku "Ten sterownik nie obsługuje tworzenia tymczasowych adresów URL.". Na przykład: '$ url = Storage :: disk ('s3') -> temporaryUrl (...);'. – pnairn

+0

Muszę również podać 's3', aby uniknąć wyjątku dzięki @pnairn – Ehsan

+0

Co musisz zrobić inaczej, jeśli pliki s3 używają CloudFront? Udało mi się wygenerować podpisany adres URL S3 przy użyciu powyższej metody, ale chcę użyć adresu URL w chmurze. czy to możliwe? – Justin

Powiązane problemy