您好,登錄后才能下訂單哦!
這篇文章主要講解了“Laravel怎么集成GitHub來存儲文件”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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 - 用戶名和密碼
OAuth3 Token - token
OAuth3 key/secret - client_id 和 client_secret (只支持查詢)
推薦使用第 2 種方式。
Settings > Developer settings > Personal access tokens > Generate new token
生成的 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 App\Traits;use Exception;use Illuminate\Support\Str; use Illuminate\Support\Facades\Http; 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怎么集成GitHub來存儲文件”的內容了,經過本文的學習后,相信大家對Laravel怎么集成GitHub來存儲文件這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。