在Laravel中使用S3进行文件存储
#php #laravel #s3

本文最初是由Funke Faith OlasupoHoneybadger 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用户访问存储桶及其物品的权限,您必须应用存储桶策略。对象权限仅适用于存储业所有者创建的项目。

首先选择水桶。

Create Bucket

选择“权限”选项卡,然后在“存储策略会话”中选择“编辑”。

Permission

复制水桶ARN,然后继续进行策略生成器。

ARN

编辑语句。使用您之前复制的ARN。

Policy Generator

生成策略文档。

Policy Document

该策略是以JSON格式生成的。复制并将其粘贴到“存储策​​略”选项卡中并保存。在创建存储措施策略之前,请确保您在“权限”选项卡中未选中“阻止所有公共访问”。

Policy Document

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的表格。看起来应该这样:

Upload

上传图像后,它提供了成功的警报。您也可以检查存储桶以查看图像是否成功上传。

Success

Image

结论

在本教程中,您学会了如何使用Laravel中的S3处理文件存储。 Laravel中的文件存储本身就是一个广泛的概念,但是本教程可以作为出色的入门指南。更多信息可以在official Laravel documentation中找到。该项目的代码为开源和可用的on GitHub

我对更好地实施API的方法,贡献和对话开放,因此请评论存储库或DM ME @twitter

快乐的编码!