站长家园(原代码之家)(www.adminjie.com)网站源码,微信源码,游戏源码,商业源码分享平台。
当前位置:网站首页 技术文章 网络编程 正文

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

时间:2022-01-10 [网络编程]作者:fabuyuan 浏览:3 次

下面由Laravel教程栏目给大家介绍Laravel 怎么集成 GitHub 来存储文件,希望对大家有所帮助!

GitHub API 介绍

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

需要用到的是功能十分强大的 GitHub API,这里只需要 创建或更新文件内容 接口。

创建或更新文件内容

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

  • 请求方式:PUT

参数

名称类型位置描述
acceptstringheader建议设置为 application/vnd.github.v3+json
ownerstringpath用户名
repostringpath仓库名
pathstringpath文件存储路径
messagestringbody必填 - The commit message
contentstringbody必填 - 新文件内容,使用 Base64 编码
shastringbody如果要更新文件,则必填 - 被替换文件的 blob SHA
branchstringbody分支名称 - 版本库的默认分支通常是 master
committerobjectbody提交人 - 默认为已认证的用户
authorobjectbody文件的作者 - 默认为 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

讲讲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 仓库
 */
 '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视频教程(推荐)

以上就是讲讲Laravel如何集成GitHub来存储文件的详细内容,更多请关注站长家园其它相关文章!

本文标签:  laravelgithub

转载请注明来源:讲讲Laravel如何集成GitHub来存储文件

本文永久链接地址:https://www.adminjie.com/post/7466.html

免责声明:
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

附:
二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!

版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的部分源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,若有侵犯你的权益请:提交版权证明文件到邮箱 2225329873#qq.com(#换为@) 站长会进行审查之后,情况属实的会在三个工作日内为您删除。

  • 站长家园(原代码之家)会员升级
  • 最新文章
    • ajax怎么将异步请求改为同步

      ajax怎么将异步请求改为同步

      AJAX中根据async值的不同可分为同步和异步,默认情况下async值是true(异步提交);而想将异步改为同步,只需要将async的值设置为false即可。...

    • ajax是干什么的

      ajax是干什么的

      AJAX是一种用于创建快速动态网页的技术,可以用来:1、做局部请求以实现局部刷新(不刷新页面而更新网页);2、在页面加载后从服务器请求数据;3、在页面加载后从服...

    • javascript怎样求1-100的素数

      javascript怎样求1-100的素数

      方法:1、用“for(vari=2;i<=100;i++){for(varj=2;j<i;j++){if(i%j==0){}}”判断能够被整数整...

    • JavaScript中end是什么意思

      JavaScript中end是什么意思

      在JavaScript中,end的意思是“结束”,end()方法的作用就是结束当前链条中的最近的筛选操作,并将匹配元素集还原为之前的状态,语法为“元素.end(...

    • 十分钟教你使用css实现烟雾效果

      十分钟教你使用css实现烟雾效果

      本篇文章给大家分享怎样利用css实现烟雾的效果,希望对大家有帮助。仔细观察烟雾效果,有两个比较重要的特点:模糊效果颗粒感首先看模糊效果,想到模糊,大部分同学首先...

  • 买服务器送会员
  • 热门文章
  • 买服务器送会员