iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
1
自我挑戰組

Laravel 實戰經驗分享系列 第 21

Laravel 實戰經驗分享 - Day21 Laravel File Storage

  • 分享至 

  • xImage
  •  

許多系統都擁有檔案上傳的功能,而 Laravel 提供了許多檔案上傳的方式,除了本地外,也包括了 AWS S3 的儲存,這讓許多開發者有了不同的選擇,今天我們來講如何利用 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

    • 設定 Public access 勾選 Everyone 以及 Read bucket permissions

Laravel 專案設定

  • 先載入相依套件
composer require league/flysystem-aws-s3-v3
  • Upload 程式
    • 一般使用方法

      • routes/web.php 內新增以下程式碼,作為上傳資料儲存的 Route
      Route::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 內新增以下參數
    • AWS_DEFAULT_REGION 為託管地區的編號
    • AWS_URL 的命名方式為 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

Demo

  • 檔案上傳

  • 即可看到 bucket 內已有檔案上傳


今天就先講到這囉~明天見!


上一篇
Laravel 實戰經驗分享 - Day20 Laravel 的自創型別 Collections
下一篇
Laravel 實戰經驗分享 - Day22 定期排程,每天都該做的事就交給它!
系列文
Laravel 實戰經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言