目录
1.1 注册GitHub账号 此步骤自己操作,就不介绍了;GItHub官网地址:https://github.com/
1.2 创建一个仓库

1.3 填写仓库信息

1.4 打开设置,去生成一个Token

1.5 选择左侧菜单的Developer settings

1.6 之后选择左侧Personal access tokens,再点击Generate new token

1.7 ①:填写Note ②:勾选repo ③点生成按钮 Generate token

1.8 即可看见生成的token,注意这里token只显示一次,记得保存,至此配置完毕!

2.1 下载PicGo
官网地址:PicGo
GitHub下载地址:Release 2.3.0 · Molunerfinn/PicGo · GitHub
如果安装成功,picGo不能正常使用,则可以用兼容模式启动。【此问题因电脑而异】

2.2 配置PicGo
仓库名:[GItHub用户名] / [第一步新建的仓库名]
分支:默认是master,但是从2020.10.1开始,GitHub的默认分支名更改为main
设定token:1.8步骤中生成的token
指定存储路径:选填,如果填写存储的文件会到此路径下
设置自定义域名:https://cdn.jsdelivr.net/gh/[github用户名]/[仓库名]@main

至此,github+picGo的配置完成,可以在上传区进行图片上传了。
2.3 可能遇到的问题
如果上传失败可以查看日志:
方法一:C:\Users\Administrator\AppData\Roaming\picgo 里面找到log文件
方法二:直接在PicGo设置里面点击打开日志
2.3.1 日志中出现异常:
问题一:RequestError: Error: unable to verify the first certificate。
原因:可能是你打开了GitHub的加速器,关闭即可
问题二:在github仓库中查看上传的图片是图裂
解决:在本地系统C:windows/System32/drivers/etc/host文件中添加以下内容
- GitHub Start
- 140.82.113.3 github.com
- 140.82.114.20 gist.github.com
- 151.101.184.133 assets-cdn.github.com
- 151.101.184.133 raw.githubusercontent.com
- 151.101.184.133 gist.githubusercontent.com
- 151.101.184.133 cloud.githubusercontent.com
- 151.101.184.133 camo.githubusercontent.com
- 151.101.184.133 avatars0.githubusercontent.com
- 199.232.68.133 avatars0.githubusercontent.com
- 199.232.28.133 avatars1.githubusercontent.com
- 151.101.184.133 avatars1.githubusercontent.com
- 151.101.184.133 avatars2.githubusercontent.com
- 199.232.28.133 avatars2.githubusercontent.com
- 151.101.184.133 avatars3.githubusercontent.com
- 199.232.68.133 avatars3.githubusercontent.com
- 151.101.184.133 avatars4.githubusercontent.com
- 199.232.68.133 avatars4.githubusercontent.com
- 151.101.184.133 avatars5.githubusercontent.com
- 199.232.68.133 avatars5.githubusercontent.com
- 151.101.184.133 avatars6.githubusercontent.com
- 199.232.68.133 avatars6.githubusercontent.com
- 151.101.184.133 avatars7.githubusercontent.com
- 199.232.68.133 avatars7.githubusercontent.com
- 151.101.184.133 avatars8.githubusercontent.com
- 199.232.68.133 avatars8.githubusercontent.com
- GitHub End
GitHub Rest API文档:仓库内容 - GitHub Docs
- <dependency>
- <groupId>cn.hutoolgroupId>
- <artifactId>hutool-allartifactId>
- <version>5.6.4version>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.76version>
- dependency>
请求所需参数,由于token关键字不让发文,我就用图片代替

自己封装的工具类
- import cn.hutool.http.HttpRequest;
- import cn.hutool.http.HttpResponse;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.ying.demo.Param;
- import lombok.extern.slf4j.Slf4j;
-
- import java.io.IOException;
- import java.nio.file.Files;
- import java.nio.file.Paths;
- import java.util.ArrayList;
- import java.util.Base64;
- import java.util.List;
- import java.util.UUID;
-
- /**
- * @author 小影
- * @create: 2022/7/28 17:27
- * @describe:GitHub图床工具类
- */
- @Slf4j
- public class GitHubFileUtil {
-
-
- /**
- * 上传文件
- *
- * @param filepath 文件地址
- * @param filePostfix 文件后缀
- * @param message 提交描述
- * @return 文件访问地址
- */
- public static String uploading(String filepath, String filePostfix, String message) {
- // 把上传文件内容Base64
- String fileBase64 = encryptToBase64(filepath);
- // 重置文件名防止重复
- String fileName = UUID.randomUUID().toString().replace("-", "") + filePostfix;
- JSONObject param = new JSONObject();
- param.put("message", message);// 提交描述
- param.put("content", fileBase64);// Base64过的文件
- param.put("branch", Param.branch);// 上传到仓库的分支,以前是master;2020.10.01开始就变成了main了
- JSONObject committer = new JSONObject();
- committer.put("name", Param.name); // 提交的作者或提交者的姓名
- committer.put("email", Param.email);// 提交的作者或提交者的电子邮件
- param.put("committer", committer);
- param.put("sha", "");// 添加的时候没有参数也要写""
- String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
- url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
- .replace("REPO", Param.REPO)// 仓库名称
- .replace("PATH", Param.PATH);// 存储仓库里面的路径
- url = url + fileName;
-
- HttpResponse response = HttpRequest.put(url)
- .header("Accept", "application/vnd.github+json")
- .header("Authorization", Param.Authorization).body(param.toString()).execute();
- log.info("响应结果:{}", response.body());
- JSONObject jsonObject = JSONObject.parseObject(response.body());
- // 取出访问地址
- JSONObject content = jsonObject.getJSONObject("content");
- String download_url = content.getString("download_url");
- return download_url;
- }
-
- /**
- * 查询所有文件的访问地址
- *
- * @param directory 要查询那个目录下的所有图片
- * @return 所有文件访问地址集合
- */
- public static List
getFileAll(String directory) { - String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
- url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
- .replace("REPO", Param.REPO)// 仓库名称
- .replace("PATH", directory);// 存储仓库里面的路径
-
- HttpResponse response = HttpRequest.get(url)
- .header("Accept", "application/vnd.github+json")
- .header("Authorization", Param.Authorization).execute();
- JSONArray objects = JSONObject.parseArray(response.body());
- List
allImages = new ArrayList<>(); - objects.forEach(obj -> {
- JSONObject jsonObject = JSONObject.parseObject(obj.toString());
- allImages.add(jsonObject.getString("download_url"));
- });
- return allImages;
- }
-
- /**
- * 查询单文件
- *
- * @param fileUrl github库中的路径;例:img/xxx.jpg
- * @return 文件访问地址
- */
- public static String getImages(String fileUrl) {
- String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
- url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
- .replace("REPO", Param.REPO)// 仓库名称
- .replace("PATH", fileUrl);// 存储仓库里面的路径
-
- HttpResponse response = HttpRequest.get(url)
- .header("Accept", "application/vnd.github+json")
- .header("Authorization", Param.Authorization).execute();
- log.info("响应结果:{}", response.body());
- JSONObject result = JSONObject.parseObject(response.body());
- return result.getString("download_url");
- }
-
- /**
- * 查询sha 替换、删除文件时使用
- *
- * @param fileUrl github库中的路径;例:img/xxx.jpg
- * @return sha
- */
- public static String getSha(String fileUrl) {
- String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
- url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
- .replace("REPO", Param.REPO)// 仓库名称
- .replace("PATH", fileUrl);// 存储仓库里面的路径
-
- HttpResponse response = HttpRequest.get(url)
- .header("Accept", "application/vnd.github+json")
- .header("Authorization", Param.Authorization).execute();
- log.info("响应结果:{}", response.body());
- JSONObject result = JSONObject.parseObject(response.body());
- return result.getString("sha");
- }
-
- /**
- * 替换文件
- *
- * @param filepath 新文件地址
- * @param message 提交描述
- * @param sha 被替换文件的标识
- * @param path 要替换的路径+文件名 例:img/12.png
- * @return 新文件访问地址
- */
- public static String updateFile(String filepath, String message, String sha, String path) {
- // 把上传文件内容Base64
- String fileBase64 = encryptToBase64(filepath);
- // 重置文件名防止重复
- JSONObject param = new JSONObject();
- param.put("message", message);// 提交描述
- param.put("content", fileBase64);// Base64过的文件
- param.put("branch", Param.branch);// 上传到仓库的分支,以前是master;2020.10.01开始就变成了main了
- JSONObject committer = new JSONObject();
- committer.put("name", Param.name); // 提交的作者或提交者的姓名
- committer.put("email", Param.email);// 提交的作者或提交者的电子邮件
- param.put("committer", committer);
- param.put("sha", sha);// 修改必填
- String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
- url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
- .replace("REPO", Param.REPO)// 仓库名称
- .replace("PATH", path);// 存储仓库里面的路径
-
- HttpResponse response = HttpRequest.put(url)
- .header("Accept", "application/vnd.github+json")
- .header("Authorization", Param.Authorization).body(param.toString()).execute();
- log.info("响应结果:{}", response.body());
- JSONObject jsonObject = JSONObject.parseObject(response.body());
- // 取出访问地址
- JSONObject content = jsonObject.getJSONObject("content");
- String download_url = content.getString("download_url");
- return download_url;
- }
-
-
- /**
- * 删除文件
- *
- * @param message 提交描述
- * @param sha 被删除文件的标识
- * @param path 删除文件路径 例:img/12.png
- * @return status[200:成功;404:找不到资源;409:冲突;422:验证失败,参数有问题;503:暂停服务]
- */
- public static Integer delFile(String message, String sha, String path) {
- JSONObject param = new JSONObject();
- param.put("message", message);
- param.put("sha", sha);// 删除必填
- param.put("branch", "main");// 分支名称选填
- JSONObject committer = new JSONObject();//提价者信息
- committer.put("name", "2849799912");
- committer.put("email", "2849799912@qq.com");
- param.put("committer", committer);
-
- String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
- url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
- .replace("REPO", Param.REPO)// 仓库名称
- .replace("PATH", path);// 存储仓库里面的路径
-
- HttpResponse response = HttpRequest.delete(url)
- .header("Accept", "application/vnd.github+json")
- .header("Authorization", Param.Authorization).body(param.toString()).execute();
- log.info("响应结果:{}", response.body());
- return response.getStatus();
- }
-
-
- /**
- * 获取存储库自述文件README.md
- *
- * @return README.md的内容
- */
- public static String getReadme() {
- String url = "https://api.github.com/repos/OWNER/REPO/readme";
- url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
- .replace("REPO", Param.REPO);// 仓库名称
-
- HttpResponse response = HttpRequest.get(url)
- .header("Accept", "application/vnd.github+json")
- .header("Authorization", Param.Authorization).execute();
- log.info("响应结果:{}", response);
- JSONObject jsonObject = JSONObject.parseObject(response.body());
- return jsonObject.getString("download_url");
- }
-
- /**
- * 文件转base64
- *
- * @param filePath 文件地址
- * @return
- */
- public static String encryptToBase64(String filePath) {
- if (filePath == null) {
- return null;
- }
- try {
- byte[] b = Files.readAllBytes(Paths.get(filePath));
- return Base64.getEncoder().encodeToString(b);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
测试:
- // 测试上传文件
- @Test
- void uploading() {
- String resp = GitHubFileUtil.uploading("D:\\12.png", ".png", "测试提交");
- System.out.println("访问|下载地址 = " + resp);
- }
-
- // 查询所有文件的访问地址
- @Test
- void getFileAll() {
- List
imagesUrlList = GitHubFileUtil.getFileAll("img"); - imagesUrlList.forEach(System.out::println);
- }
-
- // 替换文件
- @Test
- void updateFile() {
- String sha = GitHubFileUtil.getSha("img/12.png");
- String url = GitHubFileUtil.updateFile("D:\\12.png", "替换文件", sha, "img/12.png");
- System.out.println("url = " + url);
- }
-
- // 删除文件
- @Test
- void delFile() {
- String sha = GitHubFileUtil.getSha("img/12.png");
- Integer code = GitHubFileUtil.delFile("测试删除", sha, "img/12.png");
- System.out.println("结果状态 = " + code);
- }
-
- // 获取存储库自述文件README.md
- @Test
- void getReadme() {
- String resp = GitHubFileUtil.getReadme();
- System.out.println("结果 = " + resp);
- }
这是小编在开发学习使用和总结的小Demo, 这中间或许也存在着不足,希望可以得到大家的理解和建议。如有侵权联系小编!