Get file's signed URL from amazon s3 using Filesystem Laravel 5.2

后端 未结 4 601
南旧
南旧 2021-01-30 10:55

I\'m looking for a good solution to get the signed url from amazon s3.

I have a version working with it, but not using laravel:



        
相关标签:
4条回答
  • 2021-01-30 11:30

    the above explain answer (@brian_d) is ok, but it takes too much time to generate presigned url. i wasted almost 4-5 days to overcome that. finally following worked for me. Thanks to @Kenth.

    use Carbon\Carbon;
    use Illuminate\Support\Facades\Storage;
    
    $disk = Storage::disk('s3');
    $url = $disk->getAwsTemporaryUrl($disk->getDriver()->getAdapter(), $value, Carbon::now()->addMinutes(5), []);
    
    0 讨论(0)
  • 2021-01-30 11:32

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

    Make sure you have the AWS for flysystem composer package too (version will vary):

    "league/flysystem-aws-s3-v3": "1.0.9"
    
    0 讨论(0)
  • 2021-01-30 11:46

    For Laravel 5.5 and up, you can now use temporary URLs/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)
    );
    

    This only works for s3 storage driver AFAIK.

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

    0 讨论(0)
  • 2021-01-30 11:46

    After lot of bugs, at last, I found the solution of accessing private content of s3 bucket using below code:-

    use Storage;
    use Config;
    
    $client = Storage::disk('s3')->getDriver()->getAdapter()->getClient();
    $bucket = Config::get('filesystems.disks.s3.bucket');
    
    $command = $client->getCommand('GetObject', [
        'Bucket' => $bucket,
        'Key' => '344772707_360.mp4'  // file name in s3 bucket which you want to access
    ]);
    
    $request = $client->createPresignedRequest($command, '+20 minutes');
    
    // Get the actual presigned-url
    echo $presignedUrl = (string)$request->getUri();
    
    0 讨论(0)
提交回复
热议问题