学习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是返回的下载路径,可以上传到自己的数据库哦,上传成功后,界面会变成
这个样子,暂时就这样吧,数据库层的操作,等我找时间补充回来.
版权归原作者 杀死庸碌的我 所有, 如有侵权,请联系我们删除。