文章目录
前言
在项目中,我们经常会遇到上传图片的的需求,然而将图片上传到本地服务器上会占用服务器资源。这个时候,我们就需要有一个地方能代替本地服务器存放图片了,那当然是别人的服务器(也就是远端图床)了!!这多是一件美事啊~
这里我推荐一款图床SM.MS,这一款图床,注册完之后,会赠送5GB的容量,这已经完全满足我的日常的需要了,不够也可以购买。
如何在java项目中上传图片到SM.MS?
1.看一下我的环境:
- tomcat 8.5
- jdk 1.8
其实我觉得环境应该没有太大的问题哈,springboot项目中应该也是通用的
2.引入pom文件
<!--smms图片上传-->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>3.13.2</version>
</dependency>
3.获取token
(1)登录SM.MS网站
点击Dashboard
(2)获取Token
如下步骤:
4.图片上传接口编写
@ApiOperation(value = "上传文章图片接口")
@PostMapping("/upload")
@ResponseBody
public Result fileUpload(
@RequestParam(value = "imageFile") MultipartFile imageFile,
HttpServletResponse response) {
response.setHeader("Access-Control-Allow-Origin", "*");
// 主图的项目路径
String paFileName = imageFile.getOriginalFilename();
FileOutputStream stream = null;
File file = null;
try {
byte[] bytes = imageFile.getBytes();
//自定义文件名
String filename = UUID.randomUUID().toString().replace("-", "");
file = new File(filename+paFileName);
if (!file.exists()){
//创建文件
file.createNewFile();
stream = new FileOutputStream(file.getAbsoluteFile());
stream.write(bytes);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
stream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//这里是向SM.MS服务器发送上传图片请求
HttpResponse<String> response1 = Unirest.post("https://smms.app/api/v2/upload")
//这里*****是指上一步获取的token
.header("Authorization", "*******************")
.field("smfile", file)
.asString();
JSONObject jsonObject = JSONObject.parseObject(response1.getBody());
//把本地创建的文件删除,不占用本地资源
file.delete();
//imageUrl存放上传图片的地址,方便返回前端
String imageUrl = null;
//当上传的图片重复时
if (jsonObject.getString("code").equals("image_repeated")){
imageUrl=jsonObject.getString("images");
}
else {
imageUrl= JSONObject.parseObject(jsonObject.getString("data")).getString("url");
}
if (imageUrl!=null){
return Result.build(imageUrl, ResultCodeEnum.SUCCESS);
}else return Result.build(imageUrl,ResultCodeEnum.FAIL);
}
在接口中,我们接收前端发送过来的文件类型的参数,并本地创建该文件资源,再发送请求到SM.MS服务器,上传图片。可以通过getBody()方法获取响应体中的内容拿到上传的图片的url地址,再将数据包装返回前端。