• GitHub图床整合JAVA、PicGo


    目录

    一、✨配置GitHub

    二、✨整合PicGo

    三、✨整合JAVA


    一、✨配置GitHub

    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只显示一次,记得保存,至此配置完毕!


    二、✨整合PicGo

    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文件中添加以下内容

    1. GitHub Start
    2. 140.82.113.3 github.com
    3. 140.82.114.20 gist.github.com
    4. 151.101.184.133 assets-cdn.github.com
    5. 151.101.184.133 raw.githubusercontent.com
    6. 151.101.184.133 gist.githubusercontent.com
    7. 151.101.184.133 cloud.githubusercontent.com
    8. 151.101.184.133 camo.githubusercontent.com
    9. 151.101.184.133 avatars0.githubusercontent.com
    10. 199.232.68.133 avatars0.githubusercontent.com
    11. 199.232.28.133 avatars1.githubusercontent.com
    12. 151.101.184.133 avatars1.githubusercontent.com
    13. 151.101.184.133 avatars2.githubusercontent.com
    14. 199.232.28.133 avatars2.githubusercontent.com
    15. 151.101.184.133 avatars3.githubusercontent.com
    16. 199.232.68.133 avatars3.githubusercontent.com
    17. 151.101.184.133 avatars4.githubusercontent.com
    18. 199.232.68.133 avatars4.githubusercontent.com
    19. 151.101.184.133 avatars5.githubusercontent.com
    20. 199.232.68.133 avatars5.githubusercontent.com
    21. 151.101.184.133 avatars6.githubusercontent.com
    22. 199.232.68.133 avatars6.githubusercontent.com
    23. 151.101.184.133 avatars7.githubusercontent.com
    24. 199.232.68.133 avatars7.githubusercontent.com
    25. 151.101.184.133 avatars8.githubusercontent.com
    26. 199.232.68.133 avatars8.githubusercontent.com
    27. GitHub End

    三、✨整合JAVA

    GitHub Rest API文档:仓库内容 - GitHub Docs

    1. <dependency>
    2. <groupId>cn.hutoolgroupId>
    3. <artifactId>hutool-allartifactId>
    4. <version>5.6.4version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.alibabagroupId>
    8. <artifactId>fastjsonartifactId>
    9. <version>1.2.76version>
    10. dependency>

    请求所需参数,由于token关键字不让发文,我就用图片代替

     

    自己封装的工具类

    1. import cn.hutool.http.HttpRequest;
    2. import cn.hutool.http.HttpResponse;
    3. import com.alibaba.fastjson.JSONArray;
    4. import com.alibaba.fastjson.JSONObject;
    5. import com.ying.demo.Param;
    6. import lombok.extern.slf4j.Slf4j;
    7. import java.io.IOException;
    8. import java.nio.file.Files;
    9. import java.nio.file.Paths;
    10. import java.util.ArrayList;
    11. import java.util.Base64;
    12. import java.util.List;
    13. import java.util.UUID;
    14. /**
    15. * @author 小影
    16. * @create: 2022/7/28 17:27
    17. * @describe:GitHub图床工具类
    18. */
    19. @Slf4j
    20. public class GitHubFileUtil {
    21. /**
    22. * 上传文件
    23. *
    24. * @param filepath 文件地址
    25. * @param filePostfix 文件后缀
    26. * @param message 提交描述
    27. * @return 文件访问地址
    28. */
    29. public static String uploading(String filepath, String filePostfix, String message) {
    30. // 把上传文件内容Base64
    31. String fileBase64 = encryptToBase64(filepath);
    32. // 重置文件名防止重复
    33. String fileName = UUID.randomUUID().toString().replace("-", "") + filePostfix;
    34. JSONObject param = new JSONObject();
    35. param.put("message", message);// 提交描述
    36. param.put("content", fileBase64);// Base64过的文件
    37. param.put("branch", Param.branch);// 上传到仓库的分支,以前是master;2020.10.01开始就变成了main了
    38. JSONObject committer = new JSONObject();
    39. committer.put("name", Param.name); // 提交的作者或提交者的姓名
    40. committer.put("email", Param.email);// 提交的作者或提交者的电子邮件
    41. param.put("committer", committer);
    42. param.put("sha", "");// 添加的时候没有参数也要写""
    43. String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
    44. url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
    45. .replace("REPO", Param.REPO)// 仓库名称
    46. .replace("PATH", Param.PATH);// 存储仓库里面的路径
    47. url = url + fileName;
    48. HttpResponse response = HttpRequest.put(url)
    49. .header("Accept", "application/vnd.github+json")
    50. .header("Authorization", Param.Authorization).body(param.toString()).execute();
    51. log.info("响应结果:{}", response.body());
    52. JSONObject jsonObject = JSONObject.parseObject(response.body());
    53. // 取出访问地址
    54. JSONObject content = jsonObject.getJSONObject("content");
    55. String download_url = content.getString("download_url");
    56. return download_url;
    57. }
    58. /**
    59. * 查询所有文件的访问地址
    60. *
    61. * @param directory 要查询那个目录下的所有图片
    62. * @return 所有文件访问地址集合
    63. */
    64. public static List getFileAll(String directory) {
    65. String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
    66. url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
    67. .replace("REPO", Param.REPO)// 仓库名称
    68. .replace("PATH", directory);// 存储仓库里面的路径
    69. HttpResponse response = HttpRequest.get(url)
    70. .header("Accept", "application/vnd.github+json")
    71. .header("Authorization", Param.Authorization).execute();
    72. JSONArray objects = JSONObject.parseArray(response.body());
    73. List allImages = new ArrayList<>();
    74. objects.forEach(obj -> {
    75. JSONObject jsonObject = JSONObject.parseObject(obj.toString());
    76. allImages.add(jsonObject.getString("download_url"));
    77. });
    78. return allImages;
    79. }
    80. /**
    81. * 查询单文件
    82. *
    83. * @param fileUrl github库中的路径;例:img/xxx.jpg
    84. * @return 文件访问地址
    85. */
    86. public static String getImages(String fileUrl) {
    87. String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
    88. url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
    89. .replace("REPO", Param.REPO)// 仓库名称
    90. .replace("PATH", fileUrl);// 存储仓库里面的路径
    91. HttpResponse response = HttpRequest.get(url)
    92. .header("Accept", "application/vnd.github+json")
    93. .header("Authorization", Param.Authorization).execute();
    94. log.info("响应结果:{}", response.body());
    95. JSONObject result = JSONObject.parseObject(response.body());
    96. return result.getString("download_url");
    97. }
    98. /**
    99. * 查询sha 替换、删除文件时使用
    100. *
    101. * @param fileUrl github库中的路径;例:img/xxx.jpg
    102. * @return sha
    103. */
    104. public static String getSha(String fileUrl) {
    105. String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
    106. url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
    107. .replace("REPO", Param.REPO)// 仓库名称
    108. .replace("PATH", fileUrl);// 存储仓库里面的路径
    109. HttpResponse response = HttpRequest.get(url)
    110. .header("Accept", "application/vnd.github+json")
    111. .header("Authorization", Param.Authorization).execute();
    112. log.info("响应结果:{}", response.body());
    113. JSONObject result = JSONObject.parseObject(response.body());
    114. return result.getString("sha");
    115. }
    116. /**
    117. * 替换文件
    118. *
    119. * @param filepath 新文件地址
    120. * @param message 提交描述
    121. * @param sha 被替换文件的标识
    122. * @param path 要替换的路径+文件名 例:img/12.png
    123. * @return 新文件访问地址
    124. */
    125. public static String updateFile(String filepath, String message, String sha, String path) {
    126. // 把上传文件内容Base64
    127. String fileBase64 = encryptToBase64(filepath);
    128. // 重置文件名防止重复
    129. JSONObject param = new JSONObject();
    130. param.put("message", message);// 提交描述
    131. param.put("content", fileBase64);// Base64过的文件
    132. param.put("branch", Param.branch);// 上传到仓库的分支,以前是master;2020.10.01开始就变成了main了
    133. JSONObject committer = new JSONObject();
    134. committer.put("name", Param.name); // 提交的作者或提交者的姓名
    135. committer.put("email", Param.email);// 提交的作者或提交者的电子邮件
    136. param.put("committer", committer);
    137. param.put("sha", sha);// 修改必填
    138. String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
    139. url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
    140. .replace("REPO", Param.REPO)// 仓库名称
    141. .replace("PATH", path);// 存储仓库里面的路径
    142. HttpResponse response = HttpRequest.put(url)
    143. .header("Accept", "application/vnd.github+json")
    144. .header("Authorization", Param.Authorization).body(param.toString()).execute();
    145. log.info("响应结果:{}", response.body());
    146. JSONObject jsonObject = JSONObject.parseObject(response.body());
    147. // 取出访问地址
    148. JSONObject content = jsonObject.getJSONObject("content");
    149. String download_url = content.getString("download_url");
    150. return download_url;
    151. }
    152. /**
    153. * 删除文件
    154. *
    155. * @param message 提交描述
    156. * @param sha 被删除文件的标识
    157. * @param path 删除文件路径 例:img/12.png
    158. * @return status[200:成功;404:找不到资源;409:冲突;422:验证失败,参数有问题;503:暂停服务]
    159. */
    160. public static Integer delFile(String message, String sha, String path) {
    161. JSONObject param = new JSONObject();
    162. param.put("message", message);
    163. param.put("sha", sha);// 删除必填
    164. param.put("branch", "main");// 分支名称选填
    165. JSONObject committer = new JSONObject();//提价者信息
    166. committer.put("name", "2849799912");
    167. committer.put("email", "2849799912@qq.com");
    168. param.put("committer", committer);
    169. String url = "https://api.github.com/repos/OWNER/REPO/contents/PATH";
    170. url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
    171. .replace("REPO", Param.REPO)// 仓库名称
    172. .replace("PATH", path);// 存储仓库里面的路径
    173. HttpResponse response = HttpRequest.delete(url)
    174. .header("Accept", "application/vnd.github+json")
    175. .header("Authorization", Param.Authorization).body(param.toString()).execute();
    176. log.info("响应结果:{}", response.body());
    177. return response.getStatus();
    178. }
    179. /**
    180. * 获取存储库自述文件README.md
    181. *
    182. * @return README.md的内容
    183. */
    184. public static String getReadme() {
    185. String url = "https://api.github.com/repos/OWNER/REPO/readme";
    186. url = url.replace("OWNER", Param.OWNER)// 存储库的帐户所有者。名称不区分大小写
    187. .replace("REPO", Param.REPO);// 仓库名称
    188. HttpResponse response = HttpRequest.get(url)
    189. .header("Accept", "application/vnd.github+json")
    190. .header("Authorization", Param.Authorization).execute();
    191. log.info("响应结果:{}", response);
    192. JSONObject jsonObject = JSONObject.parseObject(response.body());
    193. return jsonObject.getString("download_url");
    194. }
    195. /**
    196. * 文件转base64
    197. *
    198. * @param filePath 文件地址
    199. * @return
    200. */
    201. public static String encryptToBase64(String filePath) {
    202. if (filePath == null) {
    203. return null;
    204. }
    205. try {
    206. byte[] b = Files.readAllBytes(Paths.get(filePath));
    207. return Base64.getEncoder().encodeToString(b);
    208. } catch (IOException e) {
    209. e.printStackTrace();
    210. }
    211. return null;
    212. }
    213. }

    测试:

    1. // 测试上传文件
    2. @Test
    3. void uploading() {
    4. String resp = GitHubFileUtil.uploading("D:\\12.png", ".png", "测试提交");
    5. System.out.println("访问|下载地址 = " + resp);
    6. }
    7. // 查询所有文件的访问地址
    8. @Test
    9. void getFileAll() {
    10. List imagesUrlList = GitHubFileUtil.getFileAll("img");
    11. imagesUrlList.forEach(System.out::println);
    12. }
    13. // 替换文件
    14. @Test
    15. void updateFile() {
    16. String sha = GitHubFileUtil.getSha("img/12.png");
    17. String url = GitHubFileUtil.updateFile("D:\\12.png", "替换文件", sha, "img/12.png");
    18. System.out.println("url = " + url);
    19. }
    20. // 删除文件
    21. @Test
    22. void delFile() {
    23. String sha = GitHubFileUtil.getSha("img/12.png");
    24. Integer code = GitHubFileUtil.delFile("测试删除", sha, "img/12.png");
    25. System.out.println("结果状态 = " + code);
    26. }
    27. // 获取存储库自述文件README.md
    28. @Test
    29. void getReadme() {
    30. String resp = GitHubFileUtil.getReadme();
    31. System.out.println("结果 = " + resp);
    32. }

     这是小编在开发学习使用和总结的小Demo,  这中间或许也存在着不足,希望可以得到大家的理解和建议。如有侵权联系小编! 

  • 相关阅读:
    京东店铺的所有商品API接口-(item_search_shop-获得店铺的所有商品接口),京东API接口
    SpringMVC学习笔记(一)
    一例“msvc编译器O2优化导致的崩溃”的分析
    SpringMVC的简单介绍及其使用
    100分钟带你玩转 Spring AOP,轻松吊打面试官
    Stable Diffusion webui 常用启动参数
    错误消息 “Column ‘device_id‘ in field list is ambiguous“
    【JavaEE初阶】前端篇:CSS(下篇)
    Python 函数练习题
    19.1 STL总述、发展史、组成与数据结构谈
  • 原文地址:https://blog.csdn.net/weixin_46522803/article/details/126052265