登录  /  注册
首页 > php框架 > Laravel > 正文

讲讲Laravel如何集成GitHub来存储文件

藏色散人
发布: 2022-01-07 14:52:01
转载
2087人浏览过

下面由laravel/" target="_blank">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

314a46aa1cc3432b5a3662d276d59bd.png

生成的 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中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:learnku网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号