使用gitee搭建免费图床
前言我们在平时自己开发应用时都会遇到图片等一些资源需要存放,我们放在系统本地时会占用服务器的资源。这时我们就想到了第三方存储方案。例如:阿里云的OSS对象存储腾讯云的COS对象存储以及七牛云的云存储等等。。。以上这些云服务有收费也有免费 。当然免费的或多或少都有一些问题。对于我们个人使用是非常不方便的。这里我们介绍如何使用gitee搭建自己的图床效果如下...
前言
我们在平时自己开发应用时都会遇到图片等一些资源需要存放,我们放在系统本地时会占用服务器的资源。这时我们就想到了第三方存储方案。
例如:
阿里云的OSS对象存储
腾讯云的COS对象存储
以及七牛云的云存储
等等。。。
以上这些云服务有收费也有免费 。当然免费的或多或少都有一些问题。对于我们个人使用是非常不方便的。
这里我们介绍如何使用gitee搭建自己的图床
效果如下
开始实现
首先
- 码云登录
- 进入设置
- 申请好令牌后 进行记录为后续做好准备。
接着在码云上创建一个 公开 的仓库
接下来使用码云的开发文档
-
我们主要用到的是以下接口
-
我们使用到的是
仓库->新建文件的api接口
字段说明
access_token :这个access_token就是指我们上面申请的私人令牌。
owner :就是你码云账号的名称
repo : 就是上面创建的仓库名称
path :就是文件名称。
content :文件内容,这里注意 文档上说明内容必须是以Base64编码的,这就意味着内容不能太大。
message :提交信息。
以上就是几个必传的字段说明。
原理
- 使用接口的方式进行图片提交,提交后会返回提交内容的地址。地址就是我们使用的外链地址。
原理和准备工作介绍完后下面开始编码
我们是以spring boot 框架为基础搭建的。
这里我图方便使用了hutool的工具包。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.3</version>
</dependency>
以下是上传的核心代码:
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.wdhcr.common.utils.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/*
* gitee图床工具类
*
* */
@Component
public class GiteeBucketUtil {
/**
* TODO:这个常量是码云为您分配的私人令牌,Token
*/
@Value("${gitee.giteebucket.access-token}")
private String ACCESS_TOKEN;
/**
* 仓库所属地址 这个是您的私人用户名 具体请参考创建仓库时的注意事项
*/
@Value("${gitee.giteebucket.owner}")
private String OWNER;
/**
* TODO:仓库名称 这里是您的仓库名称
*/
@Value("${gitee.giteebucket.repo-name}")
private String REPO_NAME;
/**
* TODO:上传图片的message
*/
@Value("${gitee.giteebucket.create-repos-message}")
private String CREATE_REPOS_MESSAGE;
/**
* TODO:文件前缀 这里格式化咱们上传图片的路径,在img路劲下 以每天的日期为子文件夹,进行存储。 上传地址可以自定义。
*/
private static final String IMG_FILE_DEST_PATH = "img/" + DateUtil.format(new Date(), "yyyy_MM_dd") + "/";
/**
* 新建文件
* <p>
* owner* 仓库所属空间地址(企业、组织或个人的地址path)
* repo* 仓库路径
* path* 文件的路径
* content* 文件内容, 要用 base64 编码
* message* 提交信息
* <p>
* %s =>仓库所属空间地址(企业、组织或个人的地址path) (owner)
* %s => 仓库路径(repo)
* %s => 文件的路径(path)
*/
private static final String CREATE_REPOS_URL = "https://gitee.com/api/v5/repos/%s/%s/contents/%s";
public R uploadImg(MultipartFile file) throws IOException {
if (ObjectUtils.isEmpty(file)) {
R.ok("请重新上传!");
}
String trueFileName = file.getOriginalFilename();
// 断言
assert trueFileName != null;
String suffix = trueFileName.substring(trueFileName.lastIndexOf("."));
String fileName = System.currentTimeMillis() + "_" + IdUtil.randomUUID() + suffix;
String paramImgFile = Base64.encode(file.getBytes());
//转存到gitee
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("access_token", ACCESS_TOKEN);
paramMap.put("message", CREATE_REPOS_MESSAGE);
paramMap.put("content", paramImgFile);
String targetDir = IMG_FILE_DEST_PATH + fileName;
String requestUrl = String.format(CREATE_REPOS_URL, OWNER,
REPO_NAME, targetDir);
String resultJson = HttpUtil.post(requestUrl, paramMap);
JSONObject jsonObject = JSONUtil.parseObj(resultJson);
if (jsonObject.getObj("commit") != null) {
JSONObject content = jsonObject.getJSONObject("content");
String download_url = content.getStr("download_url");
return R.ok().put("url", download_url);
} else {
return R.error("上传失败!");
}
}
}
说明
JSONObject content = jsonObject.getJSONObject(“content”);
String download_url = content.getStr(“download_url”);
这个download_url
的地址就是图片的url。
- R 返回体类
import org.apache.http.HttpStatus;
import java.util.HashMap;
import java.util.Map;
/**
* 返回数据
*
*/
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public R() {
put("code", 0);
put("msg", "success");
}
public static R error() {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
}
public static R error(String msg) {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
}
public static R error(int code, String msg) {
R r = new R();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static R ok(String msg) {
R r = new R();
r.put("msg", msg);
return r;
}
public static R ok(Map<String, Object> map) {
R r = new R();
r.putAll(map);
return r;
}
public static R ok() {
return new R();
}
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}
- 上传的controller控制层
@RestController
@Slf4j
@RequestMapping("/gitbucket")
public class UploadImgController {
@Autowired
private GiteeBucketUtil giteeBucketUtil;
@PostMapping("/upload")
public R upload(@RequestParam(value = "file",required = true) MultipartFile file) {
try {
return giteeBucketUtil.uploadImg(file);
}catch (Exception e) {
e.printStackTrace();
log.error("图片上传失败,{}",file.getOriginalFilename());
}
return R.error();
}
}
以上就是giee做图床的介绍和实现代码了。
更多推荐
所有评论(0)