首頁 > php框架 > Laravel > 主體

講講Laravel如何整合GitHub來儲存文件

藏色散人
發布: 2022-01-10 11:36:27
轉載
2313 人瀏覽過

下方由Laravel#教學專欄為大家介紹Laravel 怎麼整合 GitHub 來儲存文件,希望對大家有所幫助!

GitHub API 介紹

介面文件:docs.github.com/en/rest

需要用到的是功能十分強大的GitHub API,這裡只需要建立或更新檔案內容介面。

建立或更新檔案內容

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

  • 請求方式:PUT

##參數

名稱類型位置描述stringheader建議設定為#stringpathrepo ##pathpath檔案儲存路徑##message必填content必填Base64sha#如果要更新文件,則必填branchmastercommitterauthor##」檔案的作者- 預設為,如省略,則為認證的使用者committer 物件的屬性
#accept application/vnd.github. v3 json
owner ##使用者名稱
string path 倉庫名稱
string
stringbody - The commit message
stringbody - 新檔案內容,使用 編碼
stringbody - 被取代文件的blob SHA
stringbody 分支名稱- 版本庫的預設分支通常是
#objectbody #- 默認為已認證的使用者
#objectbodycommittercommitter

名稱

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

描述 (string)##必填422
#author 物件的屬性
name name
- 提交的作者或提交者的名字。如果省略name 會收到 狀態碼
#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 仓库
 */
 &#39;repository&#39; => env(&#39;GITHUB_FILE_REPOSITORY&#39;, &#39;&#39;),

 /**
 * 分支
 */
 &#39;branch&#39; => env(&#39;GITHUB_FILE_BRANCH&#39;, &#39;master&#39;),

 /**
 * Personal access token
 */
 &#39;token&#39; => env(&#39;GITHUB_FILE_TOKEN&#39;, &#39;&#39;),

 /**
 * 存储路径,若 GitHub 仓库中没有,则自动创建
 */
 &#39;path&#39; => env(&#39;GITHUB_FILE_PATH&#39;, &#39;&#39;),

 /**
 * 自定义域名
 * 若不定义则使用 https://raw.githubusercontent.com/ 出于某些原因可能图片加载会很慢,甚至失败
 * 建议使用 https://cdn.jsdelivr.net/gh/ 加速
 */
 &#39;domain&#39; => env(&#39;GITHUB_FILE_DOMAIN&#39;, &#39;https://cdn.jsdelivr.net/gh/&#39;),

 /**
 * 文件命名
 * 1 - 以时间戳方式重命名
 * 2 - 以随机字符串方式重命名
 * 3 - 保持原名
 * ......
 */
 &#39;name&#39; => env(&#39;GITHUB_FILE_NAME&#39;, 1),

 /**
 * commit 记录
 */
 &#39;commit_message&#39; => env(&#39;GITHUB_FILE_COMMIT_MESSAGE&#39;, &#39;&#39;),];
登入後複製
###建立一個## #Trait### 以復用上傳功能###
<?php
namespace App\Traits;use Exception;use Illuminate\Support\Str;
use Illuminate\Support\Facades\Http;
trait UploadToGithub{
    public function uploadToGithub($file, $message = &#39;&#39;)
    {
        $path = config(&#39;github-file.path&#39;) . &#39;/&#39; . $this->setFileName($file);
        $repository = config(&#39;github-file.repository&#39;);

        if ($file->isValid()) {
            $url = "https://api.github.com/repos/$repository/contents/$path";

            $response = Http::withToken(config(&#39;github-file.token&#39;))->put($url, [
                &#39;message&#39; => $message ?: config(&#39;github-file.commit_message&#39;),
                &#39;content&#39; => base64_encode(file_get_contents($file))
            ]);

            // 上传失败抛出一个错误,成功则返回 JSON
            $body = $response->throw()->json();

            // 上传成功后 GitHub API 返回的是 201,其实有了上一步这里的判断可以省略
            if ($response->successful()) {
                return config(&#39;github-file.domain&#39;)
                    ? rtrim(config(&#39;github-file.domain&#39;), &#39;/&#39;) . &#39;/&#39; . trim($repository, &#39;/&#39;) . &#39;/&#39; . ltrim($body[&#39;content&#39;][&#39;path&#39;], &#39;/&#39;)
                    : $body[&#39;content&#39;][&#39;download_url&#39;];
            }
        }

        throw new Exception(&#39;未发现图片&#39;);
    }

    /**
     * 生成图片名称
     * @param $file
     * @return mixed|string
     */
    private function setFileName($file)
    {
        switch (config(&#39;github-file.name&#39;)) {
            case 1:
                return date(&#39;YmdHis&#39;, time()) . &#39;.&#39; . $file->getClientOriginalExtension();
            case 2:
                return Str::random(32) . &#39;.&#39; . $file->getClientOriginalExtension();
            case 3:
            default:
                return $file->getClientOriginalName();
        }
    }}
登入後複製
###在需要的地方使用###UploadToGithub######
use UploadToGithub;public function updload(Request $request){
    $url = $this->uploadToGithub($request->file(&#39;file-field-name&#39;));
    
    return response()->json([
        &#39;code&#39; => 200,
        &#39;message&#39; => &#39;上传成功&#39;,
        &#39;data&#39; => [
            &#39;url&#39; => $url
        ]
    ]);}
登入後複製
############最新的五個Laravel影片教學#########(建議)    ###                             ######################################################################################################################################################################################################################################

以上是講講Laravel如何整合GitHub來儲存文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板