0


Github图床整合JAVA使用spring boot

学习JAVA的OSS对象存储时,由于不是很想使用OSS的服务,于是使用Github作为图床上传图片后获取url,本着学习的态度,搜索了关于Github的API后还是遇到了很多的困难,后来发现是个人的小问题,借鉴了其他的博客对我帮助很大,在这里我先附上学习的链接参考博客1,参考博客2

Github怎么创建仓库获取令牌我就不写了,有很多教程可以在互联网上查询按照教程配置即可,也可以看上面放的链接,我也是按照上面配置的.

废话不多说,我们准备开始代码,项目结构是这样的

我们创建一个utils的package用来存放我们的工具类,接下来我放源码

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
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;

//杀死庸碌的我
//2024:9:17
@Component
@Slf4j
public class GitHubFileUtil {

    public String upload(MultipartFile file) throws IOException{
        //获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();
        //将文件转换为base64
        byte[] fileBytes = inputStream.readAllBytes();
        String fileBase64 = Base64.getEncoder().encodeToString(fileBytes);

        //  避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
        //上传文件到GITHUB
        JSONObject param = new JSONObject();
        param.put("message", "描述");//填什么都无所谓,可以为空,就两个""也行
        param.put("content", fileBase64);
        param.put("branch", Param.branch);

        JSONObject committer = new JSONObject();
        committer.put("name", Param.name);
        committer.put("email", Param.email);
        param.put("committer", committer);
        // 设置上传的 URL
        String url = "https://api.github.com/repos/" + Param.OWNER + "/" + Param.REPO + "/contents/" + Param.PATH + fileName;

        // 发起 PUT 请求上传文件
        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");
        return content.getString("download_url");
    }
}

abstract class Param {
    public static final String branch = "main";     //上传到仓库的分支,一般都是main,用PicGo试过master不行
    public static final String name = "xxx"; // 提交的作者或提交者的姓名
    public static final String email = "[email protected]";//提交的作者或提交者的电子邮件
    public static final String OWNER = "xxx";//存库的帐户所有者。名称不区分大小写,也就是你GitHub的账号名称
    public static final String REPO = "xxx";//仓库名称
    public static final String PATH = "";//存储仓库的路径,要是直接上传直接像我这样就行或者用/分开 比如img/
    public static final String Authorization = "token xxx";//这里要注意一个很重要的点这里填入的是 "token"+"一个空格" +"你从github生成的Token"
}

这个上传图片的工具类复制到你的项目就能用,使用需要完善一下Param中的信息,为了安全起见,我建议将令牌使用环境变量的方式加载进来,具体怎么做,建议查询别的博客,自己捣鼓捣鼓,我这里就用这种方法了

接下来是controller层的代码,创建一个controller的package

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@Slf4j
@RestController
public class UploadController {
    @Autowired
    private GitHubFileUtil gitHubFileUtil;

        @PostMapping("/upload")
        public Result upload(MultipartFile image) throws IOException {
            log.info("文件上传:{}",image.getOriginalFilename());
            InputStream inputStream = image.getInputStream();
            //调用工具类进行文件上传
            String url = gitHubFileUtil.upload(image);
            log.info("文件上传完成,文件访问的url:{}",url);

            return Result.success(url);

        }

Result是一个返回前端标准数据的类我这里给一下,创建一个package叫pojo这里存放项目的been文件

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应信息 描述字符串
    private Object data; //返回的数据

    //增删改 成功响应
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

之后启动你的springboot的项目,就可以调用这个接口了,需要前端配合才能上传图片

我先随便给一个粗糙的界面好了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>

    <form action="/upload" method="post" enctype="multipart/form-data">
        头像: <input type="file" name="image"><br>
        <input type="submit" value="提交">
    </form>

</body>
</html>

访问的时候启动srpingboot项目直接访问localhost:8080/upload就行

html文件要放在resources的static下不然无法访问,这是规范.上面返回的url是返回的下载路径,可以上传到自己的数据库哦,上传成功后,界面会变成

这个样子,暂时就这样吧,数据库层的操作,等我找时间补充回来.


本文转载自: https://blog.csdn.net/2301_81869574/article/details/142317405
版权归原作者 杀死庸碌的我 所有, 如有侵权,请联系我们删除。

“Github图床整合JAVA使用spring boot”的评论:

还没有评论