一、预备知识
1. 创建token
使用github提供的接口时,需要提供token,来让github后端判断我们是否有权限去进行操作,而生成token也很简单,只需要在设置中生成即可
生成的token后续不能再次查看,所以请注意复制和保存。
2. github公共api
当前版本为
v3
,官方推荐在请求头中显式添加版本标识Accept: application/vnd.github.v3+json
获取所有的api
GET https://api.github.com
公共仓库查询api
GET https://api.github.com/user/repos
header
Authorization: token 你的token Accept: application/vnd.github.v3+json
body
无
仓库上传文件api
PUT https://api.github.com/repos/{user}/{repo}/contents/{path}/{file}
- user 仓库所属用户名
- repo 仓库名称
- path 上传的文件存放的路径,如果不存在,则会自动创建
- file 上传文件的名称
body
{
"message": "提交说明",
"content": "base64编码的文件内容"
}
content:文件内容的base64编码后的字符串
3. 使用cdn加速访问
比如上述图片content.path
,那么我们使用cdn访问的时候只需要在前面加上[https://cdn.jsdelivr.net/gh/yxr2333/imgContainer/](https://cdn.jsdelivr.net/gh/yxr2333/imgContainer/)
即可,即
https://cdn.jsdelivr.net/gh/yxr2333/imgContainer/img/4567cvay1a.png
二、使用Java上传图片到github仓库
1. 业务层代码
// 从spring的配置文件中注入值
@Value(value = "${github.token}")
public String token;
@Value(value = "${github.accept}")
public String accept;
// 设置cdn加速的base地址和请求地址
private final String baseUrl = "https://cdn.jsdelivr.net/gh/yxr2333/imgContainer/";
private final String reqUrl = "https://api.github.com/repos/yxr2333/imgContainer/contents/img/";
/**
* 上传文件
* @param file 上传的文件
* @return 上传结果
*/
@Override
public Result upload(MultipartFile file) throws IOException {
if(file.isEmpty()){
return Result.error("上传失败,请选择文件!");
}
// 将文件换成Base64编码的字符串
String base64Img = Base64.encode(file.getInputStream());
// 仓库里面不能有重复文件名的文件,所以需要对文件名加上时间戳来标识
// 避免文件名重复,使用时间戳+文件名的方式存储
String fileName = System.currentTimeMillis() + file.getOriginalFilename();
// 构建请求体的json对象
HashMap<String, String> map = new HashMap<>();
map.put("message",LocalDateTime.now() + "put");
map.put("content",base64Img);
// 发送请求
HttpResponse httpResponse = HttpRequest.put(reqUrl + fileName)
.header("Accept", accept)
.header("Authorization", token)
.header("Content-Type", "application/json")
.timeout(50000)
.body(JSONUtil.toJsonStr(map))
.execute();
if(httpResponse.isOk()){
JSONObject data = JSONUtil.parseObj(httpResponse.body());
JSONObject content = data.getJSONObject("content");
String fileUrl = baseUrl + content.getStr("path");
return Result.success("上传成功",fileUrl);
}else{
return Result.error("图床接口请求失败!");
}
}
2. 测试接口
在postman中测试接口
浏览器中输入返回的地址,发现图片已经可以正常访问了
再次请求接口,上传一张同样的图片,由于设置的文件名和上传时间相关,所以也是可以正常访问到的!