本文最初是由Funke Faith Olasupo在Honeybadger Developer Blog上撰写的。
laravel合并了一个强大的文件系统抽象,该抽象提供了与本地文件系统,SFTP和Amazon S3一起工作的简单驱动程序。本文将说明如何使用Amazon Simple Storage Service(S3)进行Laravel中的文件存储。它还提供了有关文件系统,Amazon S3存储,Laravel中的文件存储及其关系的深入基础知识。这是您会学到的一些东西:
- 文件系统。
- 什么是亚马逊S3?
- 设置Amazon S3桶。
- AWS身份和访问管理(IAM)服务。
- 配置S3云存储凭据。
- 用S3在Laravel中存储的文件存储。
介绍
Laravel Filesystem提供了不同的驱动程序,例如本地文件系统,亚马逊S3和Rackspace。这些驱动程序提供了一种方便,简便的方法,可以在本地或云上上传文件。对于Amazon S3而言,尽管该功能本质上是框架中的,但入门可能会有些迷惑,尤其是对于不熟悉AWS Suite的人而言。为了成功整合它,我们只需要我们的AWS凭据来访问控制台并创建一个新的S3存储桶。
文件系统
文件系统是控制数据的保存和访问方式的机制和数据结构。文件系统有许多类型。每个人都有自己的结构,逻辑和特征,例如速度,适应性,安全性和大小。考虑到特定应用程序,创建了一些文件系统。文件系统定义了文件的命名,保存和从存储设备检索的方式。如果没有文件系统,存储设备将带有大量数据,然后再放置。
亚马逊简单存储服务(S3)
Amazon简单存储服务(Amazon S3)是一种基于Web的云存储服务,可扩展,高速且易于使用。在Amazon Web服务上,该服务用于数据和应用程序备份和在线归档(AWS)。这是一种AWS云服务,用于以安全,高度访问和多余的方式存储数据。不同大小和扇区的客户将其用于多种目的,包括用于云本地应用程序的备份,恢复和数据存储。
这是一种基于云的对象存储服务,可提供行业领先的可扩展性,数据可用性,安全性和性能。您可以节省金钱,组织数据并建立微调的访问限制,以适合特定业务,组织和合规性要求,并具有成本效益的存储课程和易于使用的管理工具。
S3存储的好处
版本控制
版本控制允许文件/对象的不同变体驻留在同一存储桶中,但默认情况下不启用它。如果意外删除对象,则允许回滚或恢复。如果对象到期生命周期策略,S3还将管理对象的非电流版本的删除。
安全
由于加密功能和访问管理功能,存储在AWS S3环境中的数据受到保护免于未经授权的访问。这包括限制在存储桶和帐户级别上对所有物品的公共访问权限。通过强验证确保了在区域存储的数据的安全性。
数据冗余
AWS S3在S3区域中的众多设备上维护您的数据,该区域跨越至少三个可用性区域(AZS)。它减少了冗余存储(RRS),通过将数据存储在地理分离的存储桶中,从而最大程度地减少了延迟。对于地理分散位置的用户,这可以节省资源并提高应用程序效率。
可访问性,可伸缩性和耐用性
对于存储在S3中的物品,该服务保证了99.99999999%的耐用性,并提供了几种安全性和合规性认证。它允许为大多数数据类型提供多种格式的无限数据和对象存储。一个对象的存储数据集范围为1至5千兆字节。
休息和肥皂API接口
S3存储提供基于代表性状态传输(REST)和简单对象访问协议(SOAP)的Web服务接口,可与任何形式的Web开发工具包一起使用。
AWS S3存储桶
一个水桶是一个容纳对象的盒子。文件和任何描述其的元数据也被视为对象。要将对象存储在Amazon S3中,您必须首先建立一个存储桶,然后将对象上传到其上。您可以在对象中打开,下载和传输该对象。当您不再需要对象或水桶时,您可以清理资源。
如何创建S3存储桶
- Log in到您的AWS帐户;如果您已经有一个,请注册一个。
- 继续前往S3 section.
- 选择“创建桶”。
- 输入您的存储桶的唯一名称。
- 选择一个区域。
- 取消选中以阻止公共访问的框。
- 将所有其他默认设置保持不变,然后选择“创建”。
如何创建水桶策略
这是基于资源的AWS身份和访问管理(IAM)策略。为了提供其他AWS帐户或IAM用户访问存储桶及其物品的权限,您必须应用存储桶策略。对象权限仅适用于存储业所有者创建的项目。
首先选择水桶。
选择“权限”选项卡,然后在“存储策略会话”中选择“编辑”。
复制水桶ARN,然后继续进行策略生成器。
编辑语句。使用您之前复制的ARN。
生成策略文档。
该策略是以JSON格式生成的。复制并将其粘贴到“存储策略”选项卡中并保存。在创建存储措施策略之前,请确保您在“权限”选项卡中未选中“阻止所有公共访问”。
AWS身份和访问管理(IAM)服务
AWS Identity and Access Management (IAM)允许在整个AWS基础架构中进行细粒度的访问管理。您可以使用IAM来控制谁可以访问哪些服务和资源,以及在什么条件下。您可以通过IAM政策管理劳动力和系统的权限,以确保最小特权权限并轻松管理授权和未经授权的资源。
您可以管理具有AWS身份和访问管理(IAM)的AWS中的用户和权限。该服务针对拥有大量使用AWS产品的用户或系统的企业。用户的安全凭据,例如访问密钥和权限,都可以从一个位置管理。
如何创建IAM用户
如果您没有现有用户,则可以create a new one并添加允许IAM user to upload to an S3 bucket的存储措施策略。
- 选择添加用户。
- 添加用户名并选择AWS访问类型。
- 设置密码,然后继续获取权限。
- 将其他默认设置保持不变并创建用户。
- 保存用户的访问密钥ID和秘密访问密钥,因为只能查看一次秘密访问密钥。
Laravel中使用S3的文件存储
接下来,您将学习如何将文件上传到Laravel中的S3。在继续之前,请重要的是要创建您的存储桶和IAM用户。您将需要用户的访问密钥ID和秘密访问密钥。
Laravel现在有一种简单的方法将文件上传到Amazon S3。由于Laravel随时随地使用了设置,因此该方法真的很简单。我们只需要AWS凭证即可访问界面并构建一个新的S3存储桶以有效地集成它。这似乎不容易吗?
创建一个新的Laravel应用程序
您可以通过Composer命令或Laravel Installer创建一个新的Laravel项目:
laravel new project_name
or
composer create-project laravel/laravel project_name
添加Amazon S3云存储凭据
打开.env
文件并更新AWS存储桶配置。
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=<region_name>
AWS_BUCKET=<bucket_name>
AWS_USE_PATH_STYLE_ENDPOINT=false
在conig/filesystems.php
中,S3驱动程序在s3 array
中配置并可以修改以适合您的要求。
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
],
设置模型和迁移
现在我们已经进行了必要的配置更改,通过运行以下命令同时创建模型和数据库迁移:
php artisan make:model Image -m
这将在 app/models 目录中创建一个称为 image.php 的model文件,以及一个称为 create_images_table.php 的migration文件数据库/迁移目录。
更新 images.php 通过将下面的代码添加到文件顶部,该代码启用了型号mass assignment。
protected $guarded = [];
然后,如下示例所示,更新迁移文件的up()
方法。
public function up()
{
Schema::create('images', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('image');
$table->timestamps();
});
}
连接到您的数据库
Here是我写的一篇文章,该文章解释了如何connect a Laravel Application to a MySQL database。如果您有不同的数据库,请确保适当地连接到它。
安装作曲家包
在使用S3驱动程序之前,您需要通过Composer软件包管理器安装适当的软件包:
composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0"
设置控制器
要创建控制器,请运行此工匠命令:
php artisan make:controller ImageController
它将在 app/http/controllers 目录中创建一个名为 imagecontroller.php 的新文件。创建文件后,添加以下import
语句以导入控制器将使用的类:
use App\Models\Image;
use Illuminate\Http\Request;
接下来,使用upload()
方法更新控制器,以返回上传表格和store()
方法将图像上传到S3。
public function upload()
{
return view('upload');
}
public function store(Request $request)
{
$request->validate([
'title' => 'required',
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
if ($request->hasFile('image')) {
$extension = request()->file('image')->getClientOriginalExtension(); //This is to get the extension of the image file just uploaded
$image_name = time() .'_' . $request->title . '.' . $extension;
$path = $request->file('image')->storeAs(
'images',
$image_name,
's3'
);
Image::create([
'title'=>$request->title,
'image'=>$path
]);
return redirect()->back()->with([
'message'=> "Image uploaded successfully",
]);
}
}
设置路线
您需要一条途径来获取视图,另一个来存储图像。
要定义它们,请将以下代码添加到路由/web.php 。
Route::get('image-upload', [ ImageController::class, 'upload' ])->name('image.upload');
Route::post('image-store', [ ImageController::class, 'store' ])->name('image.upload.post');
然后,将import
语句添加到文件顶部。
use App\Http\Controllers\ImageController;
设置视图
您需要创建一个刀片文件资源/浏览量目录称为 upload.blade.php。并像这样更新:
<!DOCTYPE html>
<html>
<head>
<title>Laravel File Storage with Amazon S3 </title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
</head>
<body>
<div class="container d-flex justify-content-center align-items-center" style="height: 100vh;">
<div class="panel panel-primary">
<div class="panel-heading"><h2>Laravel File Storage with Amazon S3 </h2></div>
<div class="panel-body">
@if (Session::get('message'))
<div class="alert alert-success alert-block">
<strong>{{Session::get('message')}}</strong>
</div>
@endif
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('image.upload.post') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="row">
<div class="col-md-6">
<label for="">Title</label>
<input type="text" name="title" class="form-control">
</div>
<div class="col-md-6">
<label for="">Image</label>
<input type="file" name="image" class="form-control">
</div>
<div class="col-md-6">
<button type="submit" class="btn btn-success">Upload</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
测试
您现在可以测试以查看图像是否正确上传。访问http://127.0.0.1:8000/image-upload
的表格。看起来应该这样:
上传图像后,它提供了成功的警报。您也可以检查存储桶以查看图像是否成功上传。
结论
在本教程中,您学会了如何使用Laravel中的S3处理文件存储。 Laravel中的文件存储本身就是一个广泛的概念,但是本教程可以作为出色的入门指南。更多信息可以在official Laravel documentation中找到。该项目的代码为开源和可用的on GitHub。
我对更好地实施API的方法,贡献和对话开放,因此请评论存储库或DM ME @twitter。
快乐的编码!