溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Laravel怎么集成GitHub來存儲文件

發(fā)布時間:2022-01-07 15:02:48 來源:億速云 閱讀:104 作者:iii 欄目:編程語言

這篇文章主要講解了“Laravel怎么集成GitHub來存儲文件”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Laravel怎么集成GitHub來存儲文件”吧!

GitHub API 介紹

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

需要用到的是功能十分強(qiáng)大的 GitHub API,這里只需要 創(chuàng)建或更新文件內(nèi)容 接口。

創(chuàng)建或更新文件內(nèi)容

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

  • 請求方式:PUT

參數(shù)

名稱類型位置描述
acceptstringheader建議設(shè)置為 application/vnd.github.v3+json
ownerstringpath用戶名
repostringpath倉庫名
pathstringpath文件存儲路徑
messagestringbody必填 - The commit message
contentstringbody必填 - 新文件內(nèi)容,使用 Base64 編碼
shastringbody如果要更新文件,則必填 - 被替換文件的 blob SHA
branchstringbody分支名稱 - 版本庫的默認(rèn)分支通常是 master
committerobjectbody提交人 - 默認(rèn)為已認(rèn)證的用戶
authorobjectbody文件的作者 - 默認(rèn)為 committer,如省略 committer,則為認(rèn)證的用戶

committer 對象的屬性

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

author 對象的屬性

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

鑒權(quán)

官方提供了三種方式:

  • Basic authentication - 用戶名和密碼

  • OAuth3 Token - token

  • OAuth3 key/secret - client_id 和 client_secret (只支持查詢)

推薦使用第 2 種方式。

設(shè)置 token

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

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

創(chuàng)建倉庫

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

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

Laravel 代碼

需要設(shè)置幾個配置參數(shù),建議放到 .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 下創(chuàng)建一個配置文件,我創(chuàng)建了一個 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 倉庫中沒有,則自動創(chuàng)建
 */
 '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 - 以隨機(jī)字符串方式重命名
 * 3 - 保持原名
 * ......
 */
 'name' => env('GITHUB_FILE_NAME', 1),

 /**
 * commit 記錄
 */
 'commit_message' => env('GITHUB_FILE_COMMIT_MESSAGE', ''),];

創(chuàng)建一個 Trait 以復(fù)用上傳功能

<?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,其實(shí)有了上一步這里的判斷可以省略
            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('未發(fā)現(xiàn)圖片');
    }

    /**
     * 生成圖片名稱
     * @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來存儲文件”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Laravel怎么集成GitHub來存儲文件這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI