次のチュートリアルコラムでは、Laravel が GitHub を統合してファイルを保存する方法を紹介します。
GitHub API の概要
インターフェイスのドキュメント: docs.github.com/en/rest使用する必要があるものは非常に強力な GitHub API で、ファイル コンテンツ インターフェイスを作成または更新するだけで済みます。
ファイル コンテンツの作成または更新
リクエスト アドレス: api.github.com/repos/{owner}/ {repo}/content/{path}
名前
タイプ位置 | 説明 |
|
accept |
string
header
application/vnd に設定することをお勧めします.github.v3 json |
|
| ##所有者
文字列 |
パス
ユーザー名
|
| リポ |
文字列 |
パス
ウェアハウス名
|
##path |
| string | path
ファイルストレージパス
|
message |
##string |
body |
Required - コミットメッセージ
|
| content |
stringbody |
Required - Base64
|
| ## を使用してエンコードされた新しいファイル コンテンツ#sha |
stringbody
|
ファイルを更新する場合は必須 - 置換されるファイルの BLOB SHA
|
branch |
| stringbody | ブランチ名 - リポジトリのデフォルトのブランチは通常、
master
| committer |
object |
body Committer - デフォルト認証されたユーザーのファイルの作成者 |
author |
object |
body |
- デフォルトは | committer
、committer を省略した場合、認証されたユーザーになります
|
|
committer | オブジェクトの属性
名前 |
説明
##名前
(文字列)
必須 | - 提出物の作成者または提出者の名前。 name | が省略された場合、
422 ステータス コード
##email (文字列) |
# が返されます。 ##必須 - 提出物の作成者または提出者の電子メール。 email を省略した場合、 422 ステータス コード
|
date (文字列) ## が返されます。 |
author オブジェクトのプロパティ |
名前 | 説明
|
name (文字列)
必須 - の作成者または送信者提出物名。 name が省略された場合、 | 422 ステータス コード |
##email (文字列)
# が返されます。 ##必須 - 提出物の作成者または提出者の電子メール。 | email を省略した場合、422 ステータス コード
| date
(文字列)## が返されます。
| ##認証
公式は 3 つの方法を提供しています:
-
基本認証 - ユーザー名とパスワード
- #OAuth2 トークン - トークン
- OAuth2 キー/シークレット - client_id および client_secret (クエリのみをサポート)
推奨方法 2。
[設定] > [開発者設定] > [個人用アクセス トークン] > [新しいトークンの生成]
生成されたトークンは保存され、一度だけ表示されます。
jsDelivr CDN を使用して高速化できるように、ウェアハウスは必ずパブリックに設定してください。
GitHub ウェアハウスを画像ベッドとして使用する場合の問題は、中国の GitHub へのアクセスが非常に遅いことです。jsDelivr CDN を使用するとアクセスを高速化できます。 jsDelivr は、無料のオープンソース CDN ソリューションです。このプラットフォームは、中国本土と海外を接続するための初の無料 CDN サービスです。中国政府発行の ICP ライセンスを取得しているため、グレート ファイアウォールの使用を心配する必要はありません。中国の。 jsDelivr を使用してアクセスを高速化するには、カスタム ドメイン名を https://cdn.jsdelivr.net/gh/username/image bed ウェアハウス名 に設定する必要があります。
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', ''),];
ログイン後にコピー
Create a 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
]
]);}
ログイン後にコピー
最新 5 つの Laravel ビデオ チュートリアル ######(推奨)
以上がLaravel が GitHub を統合してファイルを保存する方法について話すの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。