一、预备知识

1. 创建token

使用github提供的接口时,需要提供token,来让github后端判断我们是否有权限去进行操作,而生成token也很简单,只需要在设置中生成即可
image.png
生成的token后续不能再次查看,所以请注意复制和保存。

2. github公共api

当前版本为v3,官方推荐在请求头中显式添加版本标识 Accept: application/vnd.github.v3+json

获取所有的api

  1. GET https://api.github.com

image.png

公共仓库查询api

  1. GET https://api.github.com/user/repos

header

Authorization: token 你的token Accept: application/vnd.github.v3+json

body

能获取到你所有权限为**public**的仓库信息
image.png

仓库上传文件api

  1. PUT https://api.github.com/repos/{user}/{repo}/contents/{path}/{file}
  • user 仓库所属用户名
  • repo 仓库名称
  • path 上传的文件存放的路径,如果不存在,则会自动创建
  • file 上传文件的名称

body

  1. {
  2. "message": "提交说明",
  3. "content": "base64编码的文件内容"
  4. }

content:文件内容的base64编码后的字符串

image.png

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. 业务层代码

  1. // 从spring的配置文件中注入值
  2. @Value(value = "${github.token}")
  3. public String token;
  4. @Value(value = "${github.accept}")
  5. public String accept;
  6. // 设置cdn加速的base地址和请求地址
  7. private final String baseUrl = "https://cdn.jsdelivr.net/gh/yxr2333/imgContainer/";
  8. private final String reqUrl = "https://api.github.com/repos/yxr2333/imgContainer/contents/img/";
  9. /**
  10. * 上传文件
  11. * @param file 上传的文件
  12. * @return 上传结果
  13. */
  14. @Override
  15. public Result upload(MultipartFile file) throws IOException {
  16. if(file.isEmpty()){
  17. return Result.error("上传失败,请选择文件!");
  18. }
  19. // 将文件换成Base64编码的字符串
  20. String base64Img = Base64.encode(file.getInputStream());
  21. // 仓库里面不能有重复文件名的文件,所以需要对文件名加上时间戳来标识
  22. // 避免文件名重复,使用时间戳+文件名的方式存储
  23. String fileName = System.currentTimeMillis() + file.getOriginalFilename();
  24. // 构建请求体的json对象
  25. HashMap<String, String> map = new HashMap<>();
  26. map.put("message",LocalDateTime.now() + "put");
  27. map.put("content",base64Img);
  28. // 发送请求
  29. HttpResponse httpResponse = HttpRequest.put(reqUrl + fileName)
  30. .header("Accept", accept)
  31. .header("Authorization", token)
  32. .header("Content-Type", "application/json")
  33. .timeout(50000)
  34. .body(JSONUtil.toJsonStr(map))
  35. .execute();
  36. if(httpResponse.isOk()){
  37. JSONObject data = JSONUtil.parseObj(httpResponse.body());
  38. JSONObject content = data.getJSONObject("content");
  39. String fileUrl = baseUrl + content.getStr("path");
  40. return Result.success("上传成功",fileUrl);
  41. }else{
  42. return Result.error("图床接口请求失败!");
  43. }
  44. }

2. 测试接口

在postman中测试接口
image.png
浏览器中输入返回的地址,发现图片已经可以正常访问了
image.png
再次请求接口,上传一张同样的图片,由于设置的文件名和上传时间相关,所以也是可以正常访问到的!
image.png