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

讲讲Laravel如何集成GitHub来存储文件,第1张

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

下面由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

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

创建仓库

一定要把仓库设置为公开的,目的是能够使用 JsDelivr CDN 加速。

使用 GitHub 仓库作为图床,存在的问题是国内访问 GitHub 的速度很慢,可以利用 JsDelivr CDN 来加速访问。JsDelivr 是一个免费开源的 CDN 解决方案,该平台是首个打通中国大陆与海外的免费 CDN 服务,拥有中国政府颁发的 ICP 许可证,无须担心中国防火墙问题而影响使用。使用 JsDelivr 加速访问,需要将自定义域名设置为 https://cdn.Jsdelivr.net/gh/用户名/图床仓库名

Laravel 代码

需要设置几个配置参数,建议放到 .env 文件中。

GITHUB_file_REPOSITORY=YOUR_REPOSITORYGITHUB_file_BRANCH=masterGITHUB_file_TOKEN=YOUR_TOKENGITHUB_file_PATH=YOUR_PATHGITHUB_file_name=1GITHUB_file_COMMIT_MESSAGE="YOUR COMMIT MESSAGE"

然后在 config 下创建一个配置文件,我创建了一个 github-file.PHP 配置文件

<?PHPreturn [ /** * 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 以复用上传功能

<?PHPnamespace 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来存储文件全部内容,希望文章能够帮你解决讲讲Laravel如何集成GitHub来存储文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1210551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存