GitHub图床整合JAVA、PicGo

目录

一、✨配置GitHub

二、✨整合PicGo

三、✨整合JAVA


一、✨配置GitHub

1.1 注册GitHub账号 此步骤自己操作,就不介绍了;GItHub官网地址:https://github.com/

1.2 创建一个仓库

GitHub图床整合JAVA、PicGo_第1张图片

 1.3 填写仓库信息

GitHub图床整合JAVA、PicGo_第2张图片

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

 GitHub图床整合JAVA、PicGo_第3张图片

 1.5 选择左侧菜单的Developer settings

GitHub图床整合JAVA、PicGo_第4张图片

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

GitHub图床整合JAVA、PicGo_第5张图片

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

GitHub图床整合JAVA、PicGo_第6张图片

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

GitHub图床整合JAVA、PicGo_第7张图片


二、✨整合PicGo

2.1 下载PicGo

        官网地址:PicGo

        GitHub下载地址:Release 2.3.0 · Molunerfinn/PicGo · GitHub

如果安装成功,picGo不能正常使用,则可以用兼容模式启动。【此问题因电脑而异】

 GitHub图床整合JAVA、PicGo_第8张图片

 2.2 配置PicGo

仓库名:[GItHub用户名] / [第一步新建的仓库名]

分支:默认是master,但是从2020.10.1开始,GitHub的默认分支名更改为main

设定token:1.8步骤中生成的token

指定存储路径:选填,如果填写存储的文件会到此路径下

设置自定义域名:https://cdn.jsdelivr.net/gh/[github用户名]/[仓库名]@main 

GitHub图床整合JAVA、PicGo_第9张图片

 至此,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

三、✨整合JAVA

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


    cn.hutool
    hutool-all
    5.6.4


    com.alibaba
    fastjson
    1.2.76

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

GitHub图床整合JAVA、PicGo_第10张图片

 

自己封装的工具类

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,  这中间或许也存在着不足,希望可以得到大家的理解和建议。如有侵权联系小编! 

你可能感兴趣的:(笔记&小案例,github,java,spring,boot)