基于SpringBoot的七牛云上传图片
最近写了一个项目,需要用到图片上传到云服务器,毕竟现在图片放到项目里会使项目越来越臃肿,因考虑把图片上传交给第三方处理,找了好多教程,遇到了一些坑,写一篇有关上传图片到云服务器的博客,在这里我用的是七牛云作为图片存储的第三方服务器。
上传七牛云方法:
上传图片的方式有两种:
1. 通过服务器,将文件传到服务端,由服务端上传到七牛
2. 通过前端js,将文件直接上传到七牛云
两种方式都可以上传,但服务器上传会占用服务端的带宽来上传文件,再传到服务器上,而通过前端js直接上传,只会占用客户端的资源,这样可以减轻服务端的压力。在这里我采用的是通过服务器上传,如果有写通过前端js上传文件通俗易懂的代码,不放交流一下,相互学习哈。。。
教程来喽。。。
注册七牛云
创建储存空间
讲解下为什么要选择公开空间,因为选择公开空间,别人(用户)都可以浏览到在项目里,
不然选择私有空间,就需要你分配权限了
七牛云中重要的来喽
秘钥
存储空间的访问域名
储存空间名
开始写代码啦
依赖
<!-- 七牛云 -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
application.yml配置七牛云
# 七牛云配置
# bucket是创建的存储空间名
# domain对应存储空间的访问域名
# accessKey,secretKey 秘钥
oss:
qiniu:
domain:
accessKey:
secretKey:
bucket:
Controller层
import com.baomidou.mybatisplus.extension.api.R;
import com.fc.test.service.oss.QiNiuCloudService;
import com.fc.test.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* @ClassName dell
* @Description TOOD
* @Author X
* @Data 2019/11/13
* @Version 1.0
**/
@RestController
@RequestMapping("/QiNiuCloudController")
public class QiNiuCloudController {
@Autowired
private QiNiuCloudService qiNiuCloudService;
@PostMapping("/uploadToQiNiu")
public Result upload(@RequestParam("file")MultipartFile uploadFile){
try {
return qiNiuCloudService.uploadToQiNiu(uploadFile);
} catch (IOException e){
e.printStackTrace();
return Result.error(e.getMessage());
}
}
}
Service层
import com.baomidou.mybatisplus.extension.api.R;
import com.fc.test.mapper.auto.TsysUserMapper;
import com.fc.test.model.auto.TsysUser;
import com.fc.test.util.Result;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.util.Random;
import java.util.UUID;
/**
* @ClassName dell
* @Description TOOD
* @Author X
* @Data 2019/11/13
* @Version 1.0
**/
@Service
public class QiNiuCloudService {
@Value("${oss.qiniu.accessKey}")
private String accessKey;
@Value("${oss.qiniu.bucket}")
private String bucket;
@Value("${oss.qiniu.secretKey}")
private String secretKey;
@Value("${oss.qiniu.domain}")
private String domain;
public Result uploadToQiNiu(MultipartFile uploadFile) throws IOException {
/**
* @title:
* @description: 七牛上传service
* @author: X
* @updateTime: 2019/11/15 13:57
* @return: com.fc.test.util.Result
* @param: [uploadFile]
* @throws:
*/
//构造一个带指定 Region 对象的配置
/**
* 华东 Region.region0(), Region.huadong()
* 华北 Region.region1(), Region.huabei()
* 华南 Region.region2(), Region.huanan()
* 北美 Region.regionNa0(), Region.beimei()
* 东南亚 Region.regionAs0(), Region.xinjiapo()
*/
Configuration cfg = new Configuration(Region.huanan());
//文件上传管理器
UploadManager uploadManager = new UploadManager(cfg);
//生成上传凭证,然后准备上传
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
//给图片重新设定名字
String fileName = uploadFile.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf("."));
String uuid = UUID.randomUUID().toString().toUpperCase().replace("-", "");
fileName = uuid + suffix;
//默认不指定key的情况下,以文件内容的hash值作为文件名
Response response = uploadManager.put(uploadFile.getBytes(), fileName, upToken);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
//成功 返回url name
Result r = Result.ok()
.put("url", domain + "/" + putRet.key)
.put("name", putRet.key);
return r;
}
}
自定义异常
创建common包->exception包->MyException类
创建common包->exception包->enums包->ErrorEnum类
MyException类
import com.fc.test.common.exception.enums.ErrorEnum;
import lombok.Data;
/**
* @ClassName MyException
* @Description 自定义异常
* @Author X
* @Data 2019/11/13
* @Version 1.0
**/
@Data
public class MyException extends RuntimeException{
private String msg;
private int code = 500;
public MyException(){
super(ErrorEnum.UNKNOWN.getMsg());
this.msg=ErrorEnum.UNKNOWN.getMsg();
}
public MyException(ErrorEnum eEnum,Throwable e){
super(eEnum.getMsg(),e);
this.msg=eEnum.getMsg();
this.code=eEnum.getCode();
}
public MyException(ErrorEnum eEnum){
this.msg=eEnum.getMsg();
this.code=eEnum.getCode();
}
public MyException(String exception){
this.msg=exception;
}
}
ErrorEnum类
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @ClassName ErrorEnum
* @Description error类型枚举类
* @Author X
* @Data 2019/11/13
* @Version 1.0
**/
@Getter
@AllArgsConstructor
public enum ErrorEnum {
// 系统错误
UNKNOWN(500,"系统内部错误,请联系管理员"),
PATH_NOT_FOUND(404,"路径不存在,请检查路径"),
NO_AUTH(403,"没有权限,请联系管理员"),
DUPLICATE_KEY(501,"数据库中已存在该记录"),
TOKEN_GENERATOR_ERROR(502,"token生成失败"),
NO_UUID(503,"uuid为空"),
SQL_ILLEGAL(504,"sql非法"),
//用户权限错误
INVALID_TOKEN(1001,"token不合法"),
//登录模块错误
LOGIN_FAIL(10001,"登录失败"),
CAPTCHA_WRONG(10002,"验证码错误"),
USERNAME_OR_PASSWORD_WRONG(10003,"用户名或密码错误"),
//七牛OSS错误
OSS_CONFIG_ERROR(10050,"七牛配置信息错误"),
OSS_UPLOAD_ERROR(10051,"OSSBookNote上传失败");
private int code;
private String msg;
}
创建Result类
import com.fc.test.common.exception.enums.ErrorEnum;
import java.util.HashMap;
/**
* @ClassName Result
* @Description 通用返回类
* @Author X
* @Data 2019/11/13
* @Version 1.0
**/
public class Result extends HashMap<String, Object> {
public Result() {
put("code", 200);
put("msg", "success");
}
public static Result ok() {
return new Result();
}
public static Result error() {
return error(ErrorEnum.UNKNOWN);
}
public static Result error(ErrorEnum eEnum) {
return new Result().put("code", eEnum.getCode()).put("msg", eEnum.getMsg());
}
public static Result error(String msg) {
return new Result().put("msg",msg).put("code", ErrorEnum.UNKNOWN.getCode());
}
public static Result error(Integer code , String msg){
return new Result().put("code",code).put("msg",msg);
}
public static Result exception() {
return exception(ErrorEnum.UNKNOWN);
}
public static Result exception(ErrorEnum eEnum) {
return new Result().put("code", eEnum.getCode()).put("msg", eEnum.getMsg());
}
/**
* 封装业务数据
*
* @param key
* @param value
* @return
*/
@Override
public Result put(String key, Object value) {
super.put(key, value);
//将HashMap对象本身返回
return this;
}
}