php laravel直接将文件上传到AWS S3存储桶

时间:2020-06-20 11:46:53

标签: laravel amazon-s3 aws-sdk laravel-blade aws-serverless

任何人都可以帮助我如何使用PHP laravel将文件上传到AWS S3存储桶中。但是应该使用预先签名的URL将文件直接上传到S3。

2 个答案:

答案 0 :(得分:1)

我将尝试回答这个问题。因此,有两种方法可以做到这一点:

  1. 您将预签名的URL发送到Frontend Client,让他们直接将文件上传到S3,一旦上传,他们就会将相同的URL通知您的服务器。

  2. 您直接在服务器上接收文件并将其上传到S3,在这种情况下,您将不需要任何预签名URL,因为您已经在项目内部配置了AWS访问权限。


由于解决方案1是不言自明的,因此我将尝试解释解决方案2。

Laravel提供Storage门面用于处理文件系统操作。它遵循多种驱动程序的原理-PublicLocal DiskAmazon S3FTP以及扩展驱动程序的选项。

步骤1:使用AWS密钥配置.env文件,您将需要以下值才能开始使用Amazon S3作为驱动程序:

  • AWS密钥
  • AWS秘密
  • AWS桶名称
  • AWS桶区

第2步:假设您已经将文件上传到服务器。现在,我们将从服务器将文件上传到S3。

如果您提到s3作为默认磁盘,则以下代码片段将为您完成上传:

Storage::put('avatars/1', $fileContents);

如果您使用多个磁盘,则可以通过以下方式上传文件:

Storage::disk('s3')->put('avatars/1', $fileContents);

我们完成了!您的文件现在已上传到S3存储桶。仔细检查它是否在S3存储桶中。


如果您想了解有关Laravel存储的更多信息,请click here

答案 1 :(得分:0)

use Storage;
use Config;

$client = Storage::disk('s3')->getDriver()->getAdapter()->getClient();
$bucket = Config::get('filesystems.disks.s3.bucket');

$command = $client->getCommand('PutObject', [
    '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
return $presignedUrl = (string)$request->getUri();

我们可以使用 'PutObject' 生成一个签名的 url,用于将文件上传到 S3。