講講Laravel如何集成GitHub來存儲文件

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

下面由laravel教程欄目給大家介紹laravel 怎么集成 github 來存儲文件,希望對大家有所幫助!

GitHub API 介紹

接口文檔:docs.github.com/en/rest

需要用到的是功能十分強大的 GitHub API,這里只需要 創建或更新文件內容 接口。

創建或更新文件內容

  • 請求地址:api.github.com/repos/{owner}/{repo}/contents/{path}

  • 請求方式:PUT

參數

名稱 類型 位置 描述
accept string header 建議設置為 application/vnd.github.v3+json
owner string path 用戶名
repo string path 倉庫名
path string path 文件存儲路徑
message string body 必填 – The commit message
content string body 必填 – 新文件內容,使用 Base64 編碼
sha string body 如果要更新文件,則必填 – 被替換文件的 blob SHA
branch string body 分支名稱 – 版本庫的默認分支通常是 master
committer object body 提交人 – 默認為已認證的用戶
author object body 文件的作者 – 默認為 committer,如省略 committer,則為認證的用戶

committer 對象的屬性

名稱 描述
name (string) 必填 – 提交的作者或提交者的名字。如果省略 name 會收到 422 狀態代碼
email (string) 必填 – 提交的作者或提交者的電子郵件。如果省略 email 會收到 422 狀態代碼
date (string)

author 對象的屬性

名稱 描述
name (string) 必填 – 提交的作者或提交者的名字。如果省略 name 會收到 422 狀態代碼
email (string) 必填 – 提交的作者或提交者的電子郵件。如果省略 email 會收到 422 狀態代碼
date (string)

鑒權

官方提供了三種方式:

  • Basic authentication – 用戶名和密碼

  • OAuth2 Token – token

  • OAuth2 key/secret – client_id 和 client_secret (只支持查詢)

推薦使用第 2 種方式。

設置 token

Settings > Developer settings > Personal access tokens > Generate new token

講講Laravel如何集成GitHub來存儲文件

生成的 token 要保存好,只顯示一次。

創建倉庫

一定要把倉庫設置為公開的,目的是能夠使用 jsDelivr CDN 加速。

使用 GitHub 倉庫作為圖床,存在的問題是國內訪問 GitHub 的速度很慢,可以利用 jsDelivr CDN 來加速訪問。jsDelivr 是一個免費開源的 CDN 解決方案,該平臺是首個打通中國大陸與海外的免費 CDN 服務,擁有中國政府頒發的 ICP 許可證,無須擔心中國防火墻問題而影響使用。使用 jsDelivr 加速訪問,需要將自定義域名設置為 https://cdn.jsdelivr.net/gh/用戶名/圖床倉庫名。

Laravel 代碼

需要設置幾個配置參數,建議放到 .env 文件中。

GITHUB_FILE_REPOSITORY=YOUR_REPOSITORY GITHUB_FILE_BRANCH=master GITHUB_FILE_TOKEN=YOUR_TOKEN GITHUB_FILE_PATH=YOUR_PATH GITHUB_FILE_NAME=1 GITHUB_FILE_COMMIT_MESSAGE="YOUR?COMMIT?MESSAGE"

然后在 config 下創建一個配置文件,我創建了一個 github-file.php 配置文件

<?php return [  /**  * GitHub 倉庫  */  'repository' => env('GITHUB_FILE_REPOSITORY', ''),   /**  * 分支  */  'branch' => env('GITHUB_FILE_BRANCH', 'master'),   /**  * Personal access token  */  'token' => env('GITHUB_FILE_TOKEN', ''),   /**  * 存儲路徑,若 GitHub 倉庫中沒有,則自動創建  */  'path' => env('GITHUB_FILE_PATH', ''),   /**  * 自定義域名  * 若不定義則使用 https://raw.githubusercontent.com/ 出于某些原因可能圖片加載會很慢,甚至失敗  * 建議使用 https://cdn.jsdelivr.net/gh/ 加速  */  'domain' => env('GITHUB_FILE_DOMAIN', 'https://cdn.jsdelivr.net/gh/'),   /**  * 文件命名  * 1 - 以時間戳方式重命名  * 2 - 以隨機字符串方式重命名  * 3 - 保持原名  * ......  */  'name' => env('GITHUB_FILE_NAME', 1),   /**  * commit 記錄  */  'commit_message' => env('GITHUB_FILE_COMMIT_MESSAGE', ''),];

創建一個 Trait 以復用上傳功能

<?php namespace AppTraits;use Exception;use IlluminateSupportStr; use IlluminateSupportFacadesHttp; trait UploadToGithub{     public function uploadToGithub($file, $message = '')     {         $path = config('github-file.path') . '/' . $this->setFileName($file);         $repository = config('github-file.repository');          if ($file->isValid()) {             $url = "https://api.github.com/repos/$repository/contents/$path";              $response = Http::withToken(config('github-file.token'))->put($url, [                 'message' => $message ?: config('github-file.commit_message'),                 'content' => base64_encode(file_get_contents($file))             ]);              // 上傳失敗拋出一個錯誤,成功則返回 JSON             $body = $response->throw()->json();              // 上傳成功后 GitHub API 返回的是 201,其實有了上一步這里的判斷可以省略             if ($response->successful()) {                 return config('github-file.domain')                     ? rtrim(config('github-file.domain'), '/') . '/' . trim($repository, '/') . '/' . ltrim($body['content']['path'], '/')                     : $body['content']['download_url'];             }         }          throw new Exception('未發現圖片');     }      /**      * 生成圖片名稱      * @param $file      * @return mixed|string      */     private function setFileName($file)     {         switch (config('github-file.name')) {             case 1:                 return date('YmdHis', time()) . '.' . $file->getClientOriginalExtension();             case 2:                 return Str::random(32) . '.' . $file->getClientOriginalExtension();             case 3:             default:                 return $file->getClientOriginalName();         }     }}

在需要的地方使用 UploadToGithub

use UploadToGithub;public function updload(Request $request){     $url = $this->uploadToGithub($request->file('file-field-name'));          return response()->json([         'code' => 200,         'message' => '上傳成功',         'data' => [             'url' => $url         ]     ]);}

laravel(推薦)? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享