目录
一、✨配置GitHub
二、✨整合PicGo
三、✨整合JAVA
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
cn.hutool
hutool-all
5.6.4
com.alibaba
fastjson
1.2.76
请求所需参数,由于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", "[email protected]");
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, 这中间或许也存在着不足,希望可以得到大家的理解和建议。如有侵权联系小编!