转载自: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图床相关推荐

  1. PicGo 配置Gitee 图床

    目录 1.下载安装picGo 2.打开picGo详情页面 3.创建gitee图床库 ​4. 配置picGo 5.获取gitee token信息 6.与typora搭配使用 1.下载安装picGo 百度 ...

  2. Typora中使用Gitee图床

    1.前言 之前好友写了一篇「使用gitee作为图床 ,写markdown自动上传文件」,初衷是由于我一直使用的是Typora来写博客「力推」,但之前的版本都不支持图床功能,现在新版本已经有了图床功能了 ...

  3. Typora+PicGo+Gitee 图床配置

    Typora+PicGo+Gitee 图床配置 一. 安装PicGo PicGo windows用户选择exe结尾的安装,安装时,注意修改安装位置即可 二. 安装node.js Node.js 根据自 ...

  4. Picgo的gitee图床简略设置及gitee图片仓库无法使用解决方案

    一.Typora+Picgo实现图片上传生成在线链接 Typora是大家耳熟能详的一个文档编写工具,但是我们使用Typora去插入图片时,都是使用的本地缓存图片,如果我们需要将文档发给别人或者电脑清楚 ...

  5. 使用Typora+PicGo配置Gitee图床

    彩蛋 以后每篇文章会增加点趣味性的内容,欢迎大家扔砖头. 人这一辈子,最不能透支的是什么? 这个问题,可口可乐前CEO布莱恩·戴森(Bryan Dyson)已经给出了回答,作为可口可乐CEO布莱恩·戴 ...

  6. 最近gitee图床抽风,考虑迁移图床了

    最近gitee图床抽风,考虑迁移图床了 发现问题--传到gitee图床的图片没了 之前 vscode + picgo + gitee 处理 markdown 笔记里的图片,但 picgo 突然不能用了 ...

  7. 【经验】博客|使用 dotnet-cnblog 将Gitee图床的图片、本地的图片上传到博客园中

    若在Gitee图床,需要克隆到当前目录下,本质上其实还是上传本地图片到博客园中. 使用工具dotnet-cnblogs. 参考:博客园 Markdown 图片本地上传工具发布新版了. 该工具开源,源代 ...

  8. Typora gitee图床迁移github图床教程(图文详细)

    目录 一.GitHub配置 二.Picgo的配置 三.将gitee仓库导入到GitHub中 四.批量修改图片路径 就在前几天,gitee宣布将开源仓库全部人工审核,在审核到图床仓库时,显示 因此为了保 ...

  9. gitee图床用不了,阿里云OSS搭建图床(非常详细)

    文章目录 1. 购买阿里云oss对象存储服务 2. 新建OSS Bucket 3. 配置OSS资源访问域名 4. 配置picGO 4. 将gitee图床图片迁移到OSS中 最近,打开自己的markdo ...

最新文章

  1. .Net Core In Docker 在容器内编译并发布
  2. 匿名提问:rm -rf了怎么办?
  3. Java文件上传细讲,大厂 HR 如何面试
  4. Oracle的锁表与解锁
  5. Linux内核中Makefile、Kconfig和.config的关系
  6. unicode学习笔记
  7. 10.23T1 杨辉三角
  8. 初识计算机编程语言教案,完整版,初识VB教学设计
  9. 寒流来袭·《求职初体验》
  10. python测试用例设计方法_设计测试用例的基本方法
  11. A、B、C类地址及子网掩码学习笔记
  12. 如何使用Java开发QQ机器人 方法二
  13. 19本高并发编程书籍推荐
  14. linux中的计划任务
  15. 如何制作刷爆朋友圈的H5
  16. Android bitmap.recycle()导致trying to use a recycled bitmap报错分析
  17. Hp服务器系统盘被热拔插会怎么样,被骗十几年 原来这些设备不能热插拔!
  18. AccessKey泄露利用
  19. uni-app使用countdown插件实现倒计时
  20. 银河麒麟/ubuntu 下安装/卸载软件包命令大全

热门文章

  1. 错误:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insec
  2. sublime text3--js智能提示插件以及其他常用插件
  3. 搭建ngrok服务器
  4. 地磁传感器还可以用于室内定位?
  5. Jmeter使用教学
  6. 利用Matlab设计滤波器(FDAT) .
  7. 【算法】震惊!!!史上最详细的卡特兰数浅谈!!!
  8. shell之awk命令详解
  9. js、++、--、switch、for、if
  10. 量化数值评估,查准率和召回率