下方由Laravel#教學專欄為大家介紹Laravel 怎麼整合 GitHub 來儲存文件,希望對大家有所幫助!
GitHub API 介紹
介面文件:docs.github.com/en/rest
需要用到的是功能十分強大的GitHub API,這裡只需要建立或更新檔案內容介面。
建立或更新檔案內容
#請求位址:api.github.com/repos/{owner}/ {repo}/contents/{path}
請求方式:PUT
##參數
類型 | 位置 | 描述 | |
---|---|---|---|
#accept
| stringheader | 建議設定為 | application/vnd.github. v3 json
|
owner
| #stringpath | ##使用者名稱 | |
string |
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 | 會收到422 狀態碼
#email | (string)
必填 - 提交的作者或提交者的電子郵件。如果省略 email | 會收到422 狀態碼
#date | (string)
|
|
#author 物件的屬性 |
name | 描述
name | (string)
- 提交的作者或提交者的名字。如果省略name 會收到 | 422 狀態碼 |
鑑權
官方提供了三種方式:
Basic authentication - 使用者名稱和密碼
#OAuth2 Token - token
OAuth2 key/secret - client_id 和client_secret (只支援查詢)
#建議使用第2 種方式。
Settings > Developer settings > Personal access tokens > Generate new token
產生的token 要保存好,只顯示一次。
建立倉庫
使用 GitHub 倉庫作為圖床,存在的問題是國內存取 GitHub 的速度很慢,可以利用 jsDelivr CDN 來加速存取。 jsDelivr 是一個免費開源的 CDN 解決方案,該平台是首個打通中國大陸與海外的免費 CDN 服務,擁有中國政府頒發的 ICP 許可證,無須擔心中國防火牆問題而影響使用。使用 jsDelivr 加速訪問,需要將自訂網域設定為
。
configLaravel 程式碼需要設定幾個設定參數,建議放到 .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"登入後複製
<?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', ''),];
<?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(); } }}
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來儲存文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!