Php laravel 将文件直接上传到 AWS S3 存储桶
Php laravel Upload file directly to AWS S3 bucket
任何人都可以帮助我如何使用 PHP laravel 将文件上传到 aws S3 存储桶中。但是文件应该使用预签名 URL.
直接上传到 S3
我会尽量回答这个问题。因此,有两种方法可以做到这一点:
您将预签名的 URL 发送给前端客户端,让他们直接将文件上传到 S3,一旦上传,他们就会通知您的服务器。
您直接在服务器上接收文件并将其上传到 S3,在这种情况下,您不需要任何预签名 URL,因为您已经配置了项目内部的AWS访问。
由于解决方案 1 不言自明,我将尝试解释解决方案 2。
Laravel 提供 Storage
Facade 用于处理文件系统操作。它遵循多个驱动程序的理念 - Public
、Local Disk
、Amazon S3
、FTP
加上扩展驱动程序的选项。
第 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。
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。
确保安装了这个包:
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())
);
}
在此处创建凭据:
任何人都可以帮助我如何使用 PHP laravel 将文件上传到 aws S3 存储桶中。但是文件应该使用预签名 URL.
直接上传到 S3我会尽量回答这个问题。因此,有两种方法可以做到这一点:
您将预签名的 URL 发送给前端客户端,让他们直接将文件上传到 S3,一旦上传,他们就会通知您的服务器。
您直接在服务器上接收文件并将其上传到 S3,在这种情况下,您不需要任何预签名 URL,因为您已经配置了项目内部的AWS访问。
由于解决方案 1 不言自明,我将尝试解释解决方案 2。
Laravel 提供 Storage
Facade 用于处理文件系统操作。它遵循多个驱动程序的理念 - Public
、Local Disk
、Amazon S3
、FTP
加上扩展驱动程序的选项。
第 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。
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。
确保安装了这个包:
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())
);
}
在此处创建凭据: