基于SpringBoot的七牛云上传图片

springboot 图片上传到本地_springboot 图片上传到本地

最近写了一个项目,需要用到图片上传到云服务器,毕竟现在图片放到项目里会使项目越来越臃肿,因考虑把图片上传交给第三方处理,找了好多教程,遇到了一些坑,写一篇有关上传图片到云服务器的博客,在这里我用的是七牛云作为图片存储的第三方服务器。

上传七牛云方法:

上传图片的方式有两种:

1. 通过服务器,将文件传到服务端,由服务端上传到七牛
 2. 通过前端js,将文件直接上传到七牛云

两种方式都可以上传,但服务器上传会占用服务端的带宽来上传文件,再传到服务器上,而通过前端js直接上传,只会占用客户端的资源,这样可以减轻服务端的压力。在这里我采用的是通过服务器上传,如果有写通过前端js上传文件通俗易懂的代码,不放交流一下,相互学习哈。。。

教程来喽。。。

注册七牛云

创建储存空间

springboot 图片上传到本地_SpringBoot_02

讲解下为什么要选择公开空间,因为选择公开空间,别人(用户)都可以浏览到在项目里,
不然选择私有空间,就需要你分配权限了

七牛云中重要的来喽

springboot 图片上传到本地_上传_03

秘钥

springboot 图片上传到本地_七牛云_04

存储空间的访问域名

springboot 图片上传到本地_七牛云_05

储存空间名


开始写代码啦

依赖
<!-- 七牛云 -->
        <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类

springboot 图片上传到本地_七牛云_06

创建common包->exception包->enums包->ErrorEnum类

springboot 图片上传到本地_springboot 图片上传到本地_07

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;
    }
}