前言

我们在平时自己开发应用时都会遇到图片等一些资源需要存放,我们放在系统本地时会占用服务器的资源。这时我们就想到了第三方存储方案。

例如:

阿里云的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做图床的介绍和实现代码了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐