SpringBoot整合Gitee图床
转载自:Springboot实战:实现本地上传图片到Gitee图床(含完整代码),并在其基础上增加了删除功能~!!
1.查看Gitee官方文档
https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoContentsPath
如要使用gitee图床,需要生成私人令牌。设置->私人令牌->生成新令牌,即可。
2.引入依赖
只需要引入与web、发送http请求相关的依赖即可
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.8</version></dependency>
</dependencies>
3.配置文件
server:port: 9999spring:servlet:multipart:max-file-size: 10MBmax-request-size: 100MB
4.编写工具类
按照gitee官方的api文档,对每个添加和删除文件的请求各个参数填入,请求对应的接口即可~!
package com.example.demo.utils;import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;public class GiteeImgBedUtils {/*** 码云私人令牌*/private static final String ACCESS_TOKEN = "fa9358f2ecd12575300cbfd7505844d1";/*** 码云个人空间名*/private static final String OWNER = "bosen-once";/*** 上传指定仓库*/private static final String REPO = "cloud-disk";/*** 图片访问前缀*/private static final String PRE ="https://gitee.com/" + OWNER + "/" + REPO + "/raw/master/";/*** 新建(POST)、获取(GET)、删除(DELETE)文件:()中指的是使用对应的请求方式* %s =>仓库所属空间地址(企业、组织或个人的地址path) (owner)* %s => 仓库路径(repo)* %s => 文件的路径(path)*/private static final String API_CREATE_POST ="https://gitee.com/api/v5/repos/%s/%s/contents/%s";/*** 用于提交描述*/private static final String ADD_MESSAGE = "add file";private static final String DEL_MESSAGE = "del file";/*** <p>上传文件</p>* @param multipartFile 文件* @return 返回文件下载路径后缀*/public static String upload(String path, MultipartFile multipartFile) {String originalFilename = multipartFile.getOriginalFilename();if(originalFilename == null){return null;}String targetUrl = GiteeImgBedUtils.createUploadFileUrl(path, originalFilename);// 请求体封装Map<String, Object> map = null;try {map = GiteeImgBedUtils.getUploadBodyMap(multipartFile.getBytes());} catch (IOException e) {return null;}// 借助HttpUtil工具类发送POST请求String jsonResult = HttpUtil.post(targetUrl, map);// 解析响应JSON字符串JSONObject jsonObj = JSONUtil.parseObj(jsonResult);// 请求失败if(jsonObj.getObj("commit") == null){return null;}//请求成功:返回下载地址JSONObject content = JSONUtil.parseObj(jsonObj.getObj("content"));return content.getObj("path").toString();}/*** <p>删除</p>*/public static boolean delete(String path) {String targetUrl = GiteeImgBedUtils.deleteFileUrl(path);Map<String, Object> map = getDeleteBodyMap(path);// 发送delete请求String jsonResult = HttpRequest.delete(targetUrl).form(map).execute().body();// 解析响应JSON字符串JSONObject jsonObj = JSONUtil.parseObj(jsonResult);return jsonObj.getObj("commit") != null;}/*** <p>获取sha信息</p>*/private static String getShaInfo(String path) {String targetUrl = GiteeImgBedUtils.deleteFileUrl(path);Map<String, Object> map = getFileInfoBodyMap();// 借助HttpUtil工具类发送get请求String jsonResult = HttpUtil.get(targetUrl, map);// 解析响应JSON字符串JSONObject jsonObj = JSONUtil.parseObj(jsonResult);if (jsonObj.getObj("sha") == null) {return null;}return jsonObj.getObj("sha").toString();}/*** 生成创建(获取、删除)的指定文件路径*/private static String createUploadFileUrl(String path, String originalFilename){//获取文件后缀String suffix = getFileSuffix(originalFilename);//拼接存储的图片名称String fileName = UUID.randomUUID().toString() + suffix;//填充请求路径return String.format(GiteeImgBedUtils.API_CREATE_POST,GiteeImgBedUtils.OWNER,GiteeImgBedUtils.REPO,path + "/" + fileName);}/*** <p>生成删除链接</p>*/private static String deleteFileUrl(String path) {return String.format(GiteeImgBedUtils.API_CREATE_POST,GiteeImgBedUtils.OWNER,GiteeImgBedUtils.REPO,path);}/*** 获取创建文件的请求体map集合:access_token、message、content* @param multipartFile 文件字节数组* @return 封装成map的请求体集合*/private static Map<String,Object> getUploadBodyMap(byte[] multipartFile){HashMap<String, Object> bodyMap = new HashMap<>(3);bodyMap.put("access_token", GiteeImgBedUtils.ACCESS_TOKEN);bodyMap.put("message", GiteeImgBedUtils.ADD_MESSAGE);bodyMap.put("content", Base64.encode(multipartFile));return bodyMap;}/*** 获取删除文件的请求体map集合:access_token、path、sha、message* @return 封装成map的请求体集合*/private static Map<String,Object> getDeleteBodyMap(String path){HashMap<String, Object> bodyMap = new HashMap<>(3);bodyMap.put("access_token", GiteeImgBedUtils.ACCESS_TOKEN);bodyMap.put("message", GiteeImgBedUtils.DEL_MESSAGE);bodyMap.put("sha", getShaInfo(path));return bodyMap;}/*** 获取sha的请求体map集合:access_token* @return 封装成map的请求体集合*/private static Map<String,Object> getFileInfoBodyMap(){HashMap<String, Object> bodyMap = new HashMap<>(3);bodyMap.put("access_token", GiteeImgBedUtils.ACCESS_TOKEN);return bodyMap;}/*** 获取文件名的后缀,如:changlu.jpg => .jpg* @return 文件后缀名*/private static String getFileSuffix(String fileName) {return fileName.contains(".") ? fileName.substring(fileName.indexOf('.')) : null;}
}
5.编写测试接口
这里编写两个接口,分别是调用编写好的工具类来实现增加和删除文件的功能
@RestController
public class DemoController {@RequestMapping("/add")public String add(@RequestParam("file") MultipartFile multipartFile) {return GiteeImgBedUtils.upload("demo", multipartFile);}@RequestMapping("/del")public String del(String path) {return "" + GiteeImgBedUtils.delete(path);}
}
6.使用postman测试
向http://localhost:9999/add发送post请求,并带上一张图片。
post请求发送成功后,打开gitee对应的仓库位置,可以看到此时已经在仓库对应的目录下多出了一张jpg图片。
测试完添加图片的功能后,接下来继续测试删除功能。向http://localhost:9999/del发送delete请求,并且带上图片对应的地址参数。
发送完请求后,再次访问刚刚的gitee地址,此时显示404,图片已经被删除了,无法查看~!
SpringBoot整合Gitee图床相关推荐
- PicGo 配置Gitee 图床
目录 1.下载安装picGo 2.打开picGo详情页面 3.创建gitee图床库 4. 配置picGo 5.获取gitee token信息 6.与typora搭配使用 1.下载安装picGo 百度 ...
- Typora中使用Gitee图床
1.前言 之前好友写了一篇「使用gitee作为图床 ,写markdown自动上传文件」,初衷是由于我一直使用的是Typora来写博客「力推」,但之前的版本都不支持图床功能,现在新版本已经有了图床功能了 ...
- Typora+PicGo+Gitee 图床配置
Typora+PicGo+Gitee 图床配置 一. 安装PicGo PicGo windows用户选择exe结尾的安装,安装时,注意修改安装位置即可 二. 安装node.js Node.js 根据自 ...
- Picgo的gitee图床简略设置及gitee图片仓库无法使用解决方案
一.Typora+Picgo实现图片上传生成在线链接 Typora是大家耳熟能详的一个文档编写工具,但是我们使用Typora去插入图片时,都是使用的本地缓存图片,如果我们需要将文档发给别人或者电脑清楚 ...
- 使用Typora+PicGo配置Gitee图床
彩蛋 以后每篇文章会增加点趣味性的内容,欢迎大家扔砖头. 人这一辈子,最不能透支的是什么? 这个问题,可口可乐前CEO布莱恩·戴森(Bryan Dyson)已经给出了回答,作为可口可乐CEO布莱恩·戴 ...
- 最近gitee图床抽风,考虑迁移图床了
最近gitee图床抽风,考虑迁移图床了 发现问题--传到gitee图床的图片没了 之前 vscode + picgo + gitee 处理 markdown 笔记里的图片,但 picgo 突然不能用了 ...
- 【经验】博客|使用 dotnet-cnblog 将Gitee图床的图片、本地的图片上传到博客园中
若在Gitee图床,需要克隆到当前目录下,本质上其实还是上传本地图片到博客园中. 使用工具dotnet-cnblogs. 参考:博客园 Markdown 图片本地上传工具发布新版了. 该工具开源,源代 ...
- Typora gitee图床迁移github图床教程(图文详细)
目录 一.GitHub配置 二.Picgo的配置 三.将gitee仓库导入到GitHub中 四.批量修改图片路径 就在前几天,gitee宣布将开源仓库全部人工审核,在审核到图床仓库时,显示 因此为了保 ...
- gitee图床用不了,阿里云OSS搭建图床(非常详细)
文章目录 1. 购买阿里云oss对象存储服务 2. 新建OSS Bucket 3. 配置OSS资源访问域名 4. 配置picGO 4. 将gitee图床图片迁移到OSS中 最近,打开自己的markdo ...
最新文章
- .Net Core In Docker 在容器内编译并发布
- 匿名提问:rm -rf了怎么办?
- Java文件上传细讲,大厂 HR 如何面试
- Oracle的锁表与解锁
- Linux内核中Makefile、Kconfig和.config的关系
- unicode学习笔记
- 10.23T1 杨辉三角
- 初识计算机编程语言教案,完整版,初识VB教学设计
- 寒流来袭·《求职初体验》
- python测试用例设计方法_设计测试用例的基本方法
- A、B、C类地址及子网掩码学习笔记
- 如何使用Java开发QQ机器人 方法二
- 19本高并发编程书籍推荐
- linux中的计划任务
- 如何制作刷爆朋友圈的H5
- Android bitmap.recycle()导致trying to use a recycled bitmap报错分析
- Hp服务器系统盘被热拔插会怎么样,被骗十几年 原来这些设备不能热插拔!
- AccessKey泄露利用
- uni-app使用countdown插件实现倒计时
- 银河麒麟/ubuntu 下安装/卸载软件包命令大全
热门文章
- 错误:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insec
- sublime text3--js智能提示插件以及其他常用插件
- 搭建ngrok服务器
- 地磁传感器还可以用于室内定位?
- Jmeter使用教学
- 利用Matlab设计滤波器(FDAT) .
- 【算法】震惊!!!史上最详细的卡特兰数浅谈!!!
- shell之awk命令详解
- js、++、--、switch、for、if
- 量化数值评估,查准率和召回率