許多系統都擁有檔案上傳的功能,而 Laravel 提供了許多檔案上傳的方式,除了本地外,也包括了 AWS S3 的儲存,這讓許多開發者有了不同的選擇,今天我們來講如何利用 AWS S3 來上傳檔案。
至 AWS S3 介面,點選 Create bucket
為 bucket 命名並選擇 AWS 的託管地區 (我選最近的東京)
為了之後可為檔案進行編輯、操作,因此把下方的 Block all public access
取消勾選,並同意 AWS 的 Warning Messenge,但如果是必須機密保存的文件,請依狀況謹慎選擇
點選右上方 Account 選單內的 My Security Credentials
在 Users 頁籤內點選 Add user
新增用戶並勾選 Programmatic access
在 Set Permissons 內將用戶指定可操作 S3 的權限,如圖所示,設定權限為 AmazonS3FullAccess
此步驟可先跳過
創建成功,會拿到一組 Access key 以及 Secret key
至 bucket 內的 Permission/Access Control List
composer require league/flysystem-aws-s3-v3
一般使用方法
routes/web.php
內新增以下程式碼,作為上傳資料儲存的 RouteRoute::post('upload',function(){
request()->file('file')->store(
'my-file', // 放入 AWS 內的資料夾名稱
's3'
);
return back();
})->name('upload');
./resources/views/upload.blade.php/
作為檔案上傳的畫面@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">File Upload</div>
<div class="card-body">
<form action="{{ route('upload') }}" method="post" enctype="multipart/form-data">
@csrf
<input type="file" name="file" class="form-control">
<input type="submit" class="btn btn-primary">
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
使用 Restful API
Controller
內新增
use Illuminate\Support\Facades\Storage;
use Illuminate\Contracts\Filesystem\Filesystem;
public function store(Request $request){
$image = $request->file('image');
$ext = $image->extension();
$image_name = $image->getClientOriginalName() . '.' . $ext;
$s3 = \Storage::disk('s3');
$filePath = '/my-file/' . $image_name;
$s3->put($filePath, file_get_contents($image),'public');
}
./.env
內新增以下參數
https://[bucket name].s3-[Region].amazonaws.com/
AWS_ACCESS_KEY_ID={your key id}
AWS_SECRET_ACCESS_KEY={your secret}
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=leodemoforskymirror
AWS_URL = http://leodemoforskymirror.s3-ap-northeast-1.amazonaws.com/
php artisan serve
檔案上傳
即可看到 bucket 內已有檔案上傳
今天就先講到這囉~明天見!