我有一个AWS S3存储桶,用于存储laravel应用程序的公共和私有文件的组合,如下所示:
AWS Bucket和文件夹:
myapp
|____private
|____public
在我的刀片文件中,图像显示如下:
<img src="http://myapp.com/files/10"/>
这是我的路线:
Route::get('files/{id}', 'FileController@show');
这是我的控制器显示和上传文件的方法:
public function show(Request $request, $id)
{
$file = AppFile::findOrFail($id);
$user = auth()->check() ? auth()->user() : new User;
$this->authorizeForUser($user, 'show', $file);
return Image::make(Storage::disk('s3')->get($file->path))->response();
}
public function store(FileRequest $request)
{
$file = $request->file('file');
$fileType = strtolower($request->input('file_type'));
$filePath = $fileType . '/' . Str::random(40) . '.' . $file->getClientOriginalExtension();
$user = auth()->user();
DB::beginTransaction();
try
{
$this->authorizeForUser($user, 'store', AppFile::class);
$newFile = AppFile::create([
"name" => $file->getClientOriginalName(),
"path" => $filePath,
"size" => $file->getSize(),
"mime_type" => $file->getMimeType(),
"type" => $fileType,
"user_id" => $user->id
]);
$image = Image::make($file->getRealPath())->resize(360, 180);
Storage::disk('s3')->put($filePath, $image->stream());
$content = "<textarea data-type="application/json">{"ok": true, "message": "Success", "path": "" . $newFile->path . "", "id": "" . $newFile->id . "", "name": "" . $newFile->name . "" }</textarea>";
DB::commit();
} catch (Exception $e)
{
DB::rollback();
$error = 'There was a problem uploading your file';
$content = "<textarea data-type="application/json">{"ok": false, "message": "" . $error . "" }</textarea>";
}
return response($content);
}
这是一种文件策略,通过身份验证的用户可以访问公共和私人文件,而访客用户可以仅访问公共文件:
public function show(User $user, File $file)
{
if ($file->type == 'public' || (!is_null($user->getKey()) && $file->type == 'private'))
return true;
}
}
我想添加缓存支持,因为即使是少数应用程序用户也会在AWS S3上产生数百个,有时甚至数千个GET请求。如果存储桶是私有的,即只能通过IAM用户访问,我如何缓存文件以降低S3成本?
我读过一些建议使用cloudfront的帖子,但这不只是增加了另一个成本吗?我如何用上面的控制器方法实现cloudfront,以及bucket在根级别是私有的?
使用laravels文件缓存是一个合适的选择吗?
我很想知道我可以在S3和laravel中使用什么技术,最好是一些步骤和代码来指导,这将真正有所帮助。
PS。我已经看过下面的帖子了。Laravel AWS S3存储图像缓存
最简单的选择是使用CloudFront,如果您的问题是成本,当请求转到CloudFront时,AWS S3不收取数据传输费用。
使用S3设置CloudFront非常重要,并且您可以将Bucket保持为私有,您只需要创建OAI。
检查以下链接:
https://aws.amazon.com/pt/premiumsupport/knowledge-center/cloudfront-https-requests-s3/
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html
由于CloudFront是一项公共服务,您需要将当前身份验证更改为另一种格式(请在边缘查看此链接CloudFront授权(,或者您可以使用签名URL或签名Cookie提供私人内容(请查看此另一个链接PrivateContent(;您可以使用您现有的IAM用户生成这些已签名的URL/已签名的Cookie。