IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> GitHub图床整合JAVA、PicGo -> 正文阅读

[开发工具]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文件中添加以下内容

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

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.6.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>

请求所需参数,由于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<String> 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<String> 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", "2849799912@qq.com");
      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<String> 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, ?这中间或许也存在着不足,希望可以得到大家的理解和建议。如有侵权联系小编!?

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 11:04:10  更:2022-08-06 11:06:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 5:16:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码