SpringBoot+七牛云Oss 实现头像上传(后台上传)

227 阅读3分钟

1.引入使用七牛云的 maven 依赖

<!-- 七牛云 oss-->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.1.1</version>
</dependency>

2.配置 ak ,sk, bucketName,访问图片的外链域名

  1. 在七牛云创建一个新的空间 --> buckName
  2. 在密钥管理那获取到 ak , sk
  3. 在创建的空间中获取临时外链域名(只有30天有效期)

3.配置 Properties 对象来保存属性

1.为了增加安全性,不直接将 ak , sk 写死在上传头像的功能上面,而是使用一个配置对象接收配置的数据。

2.使用 @ConfigurationProperties 来接收在 Application.yml 文件中写入的 ak , sk

/**
 * 七牛云上传配置类
 */
@Component
@ConfigurationProperties(prefix = "sky.qiniuoss")
@Data
public class QiniuOssProperties {

    private String accessKey;
    private String secreteKey;
    private String bucketName;
    private String domain;
}

4.实现上传功能的 Utils 工具类

  1. 在工具类中设置属性。在创建这个对象时,通过配置对象填充这几个属性字段
  2. getUpToken(). 上传图片到七牛云是需要通过 token 令牌,这个方法会申请一个 token
  3. put64image()。真正上传图片的方法
  4. 根据空间的地区选择要上传的地址:我的是华南地区的 :upload-z2.qiniu.com
  • 将二进制图像数据转换为Base64编码的字符串。
  • 计算 Base64 字符串的长度。
  • 构建上传到七牛云的 URL ,包括文件长度和文件的存储路径。
  • 创建一个 HTTP 请求。
  • 添加请求头,包括 Content-Type 和 Authorization 。
  • 执行HTTP POST请求,将Base64编码的图像数据上传到七牛云。
  • 如果上传成功,构建图像的URL并返回。
@Slf4j
public class QiniuCloudUtil {


    String accessKey = "";
    // 密钥配置
    String secreteKey = "";
    //空间名
    String bucketname = "";
    // 外链域名
    private  String domain ;



    public QiniuCloudUtil(String accessKey, String secreteKey, String bucketname,String domain) {
        this.accessKey = accessKey;
        this.secreteKey = secreteKey;
        this.bucketname = bucketname;
        this.domain = domain;
    }

    public String getUpToken() {
        Auth auth = Auth.create(accessKey, secreteKey);
        return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
    }

    /**
     * 文件上传
     * base64方式上传
     * @throws Exception
     */

    public  String put64image(byte[] base64, String key)   {

        String file64 = Base64.encodeToString(base64, 0);
        Integer len = base64.length;
        // 放在 /dish 目录下
        key = "dish/"+key;
        // 华南地区 upload-z2.qiniu.com
        String url = "http://upload-z2.qiniu.com/putb64/" + len + "/key/" + UrlSafeBase64.encodeToString(key);

        RequestBody rb = RequestBody.create(null, file64);
        Request request = new Request.Builder()
                .url(url)
                .addHeader("Content-Type", "application/octet-stream")
                .addHeader("Authorization", "UpToken " + getUpToken())
                .post(rb).build();

        try {
            OkHttpClient client = new OkHttpClient();
            okhttp3.Response response = client.newCall(request).execute();

            //如果不需要添加图片样式,使用以下方式
            StringBuilder stringBuilder = new StringBuilder("http://");
            String imageUrl = stringBuilder.append(domain).append("/").append(key).toString();
            return imageUrl;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

5.将 七牛云工具类填充到Spring 容器中

  1. 为了更方便地使用工具类对象。不一定要注入到容器中
  2. 在配置类中创建对象,可以灵活的填充对象属性
@Configuration
@Slf4j
public class OssConfiguration {
    @Bean
    public QiniuCloudUtil qiniuCloudUtil(QiniuOssProperties qiniuOssProperties){
        log.info("开始创建七牛云文件上传工具类对象:{}",qiniuOssProperties);
        return new QiniuCloudUtil(
                qiniuOssProperties.getAccessKey(),
                qiniuOssProperties.getSecreteKey(),
                qiniuOssProperties.getBucketName(),
                qiniuOssProperties.getDomain()
        );
    }
}

6.在 Controller 使用上传头像的功能

1.使用 UUID 作为头像的名字

2.动态获取获取图片的类型

@RestController()
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {

    @Resource
    private QiniuCloudUtil qiniuCloudUtil;

    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file)  {
        log.info("文件上传 name={}",file.getName());

        try {
            byte[] bytes = file.getBytes();
            String originalFilename = file.getOriginalFilename();
            // 截取原始文件名的后缀
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            // 构造新的文件名
            String imageName = UUID.randomUUID().toString()+extension;
            String url = qiniuCloudUtil.put64image(bytes, imageName);
            return Result.success(url);

        } catch (Exception e) {
            log.error("文件上传失败 {}",e);
        }

        return Result.success(MessageConstant.UPLOAD_FAILED);
    }


}