【问题标题】:Php laravel Upload file directly to AWS S3 bucketphp laravel 将文件直接上传到 AWS S3 存储桶
【发布时间】:2020-10-10 14:24:42
【问题描述】:

谁能帮助我如何使用 PHP laravel 将文件上传到 aws S3 存储桶。但是文件应该使用预签名的 URL 直接上传到 S3。

【问题讨论】:

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


【解决方案1】:

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

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

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


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

Laravel 提供了Storage Facade 来处理文件系统操作。它遵循多个驱动程序的理念 - PublicLocal DiskAmazon S3FTP 以及扩展驱动程序的选项。

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

  • AWS 密钥
  • AWS 秘密
  • AWS 存储桶名称
  • AWS 存储桶区域

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

如果你提到s3作为默认磁盘,下面的sn-p会为你上传:

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

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

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

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


如果你想了解更多关于 Laravel 存储的信息,click here

【讨论】:

  • 感谢您的快速帮助。你能帮我用第一种方法吗?因为我是 AWS 新手。要求是文件应该直接存储到 s3 中,而不是进入托管 laravel 项目的服务器。
  • 然后选择解决方案 1,它也会将资源保存在您的服务器上。将文件从前端直接上传到 S3。要获取预签名 URL,您可以创建一个 API,它每次都会提供新的上传 URL。
  • 但是我们该怎么做呢?有什么链接或教程可以参考吗?
  • 首先 OP 要求未回答的解决方案 1。其次,它不是自我解释的,你有预签名的 url,你用它做什么,以便纯粹在前端发送文件?我实际上是在尝试自己执行此操作,但找不到任何有关此的文档。
  • 和解决方案 2 在这种情况下完全不相关,因为 OP 明确要求不要发送到服务器并仅在前端进行上传
【解决方案2】:
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。

【讨论】:

  • 那么你如何处理这个签名的 url?
  • 您可以查看this 答案,了解如何在 js 中使用预签名 URL 将文件上传到 S3
【解决方案3】:

确保此包已安装:

composer require league/flysystem-aws-s3-v3 "^1.0"

在 AWS 上创建访问凭证并在 .env 文件中设置这些变量

AWS_ACCESS_KEY_ID=ORJATNRFO7SDSMJESWMW
AWS_SECRET_ACCESS_KEY=xnzuPuatfZu09103/BXorsO4H/xxxxxxxxxx
AWS_DEFAULT_REGION=ap-south-1
AWS_BUCKET=xxxxxxx
AWS_URL=http://xxxxx.s3.ap-south-1.amazonaws.com/


public function uploadToS3(Request $request)
{
    $file = $request->file('file');
    \Storage::disk('s3')->put(
                    'path/in/s3/filename.jpg',
                    file_get_contents($file->getRealPath())
                );
}

在此处创建凭据:

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 2018-04-25
    • 2019-10-23
    • 1970-01-01
    • 2018-08-13
    • 2018-09-19
    • 2012-05-28
    • 2017-10-17
    相关资源
    最近更新 更多