使用Java实现七牛云OSS云存储上传图片至指定目录

思路介绍

首先介绍下我的实现思路,前端通过Controller调用上传方法,上传方法中主要调用了一个七牛云的上传文件的相关代码封装的一个工具类,该工具类中的bucketName、keyId、secret等需要的固定信息是通过yaml配置文件设置的,为了读取该文件的配置信息,我把它封装为了一个名为QnOssProperties的java对象进行使用。

开始前先导入依赖别忘了,基本都是在qiniu的包下的类,爆红先检查这一项。
官方文档

Controller代码

在Controller中,我对获取的文件做了一个文件重命名,同时还指定了一个img文件夹路径,如果你存在根目录可不做此操作。这个地方的斜杠方向不能反。


@Slf4j
@Api(tags = "公共服务相关接口")
@RestController
@RequestMapping("/admin/common")
public class CommonController {
    @Autowired
    QnOssUtil qnOssUtil;
    @ApiOperation("文件上传")
    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file){
        //获取文件类型,文件名后缀,如.png
        String fileName = file.getOriginalFilename();
        fileName = fileName.substring(fileName.lastIndexOf("."));

        //生成随机文件名
        fileName = UUID.randomUUID().toString()+fileName;

        //这里额外指定了上传到服务器的哪个目录
        fileName = "img/" + fileName;

        //上传文件
        String path = null;
        try {
            byte[] bytes = file.getBytes();
            path = qnOssUtil.bytesUpload(bytes, fileName);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return Result.success(path);
    }
}

Util工具类代码

这里基本上是七牛的sdk文档中的示例代码,我做了一点改动和注释。

package com.sky.utils;

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 com.sky.properties.QnOssProperties;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

@Component
@AllArgsConstructor
public class QnOssUtil {
    private QnOssProperties qnOssProperties;

    /**
     * 本地上传
     * @param localFilePath  文件地址绝对路径
     * @return
     */
    public String localUpload(String localFilePath,String fileName) {
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.huadongZheJiang2());   //选择服务器所在的区

        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = qnOssProperties.getAccessKeyId();
        String secretKey = qnOssProperties.getAccessKeySecret();
        String bucket = qnOssProperties.getBucketName();
        //如果是Windows情况下,格式是 D:\\qiniu\\test.png
        // String localFilePath = "/home/qiniu/test.png";
        //本地文件绝对路径
        // localFilePath = "C:\\Users\\xyhk\\Downloads\\Snipaste_2023-08-02_15-46-43.png";

        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = fileName;       //指定上传至Oss服务器文件名称,使用\分隔还能指定目录
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            System.out.println(putRet.hash);
            return "http://"+qnOssProperties.getEndpoint()+"/"+putRet.key;
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }

        return null;
    }


    /**
     * 通过文件的字节数组上传
     * @return
     */
    public String bytesUpload(byte[] uploadBytes,String fileName){
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.huadongZheJiang2());       //选择服务器所在的区
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = qnOssProperties.getAccessKeyId();
        String secretKey = qnOssProperties.getAccessKeySecret();
        String bucket = qnOssProperties.getBucketName();
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = fileName;
        try {
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);
            try {
                Response response = uploadManager.put(uploadBytes, key, upToken);
                //解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                System.out.println(putRet.key);
                System.out.println(putRet.hash);
                return "http://"+qnOssProperties.getEndpoint()+"/"+putRet.key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception ex) {
            //ignore
        }
        return null;
    }
}

配置类

这一步主要是通过框架自动生成Util工具类,交给Bean管理,在这里为工具类传入所需要的QnOssProperties 参数信息

package com.sky.config;

import com.sky.properties.QnOssProperties;
import com.sky.utils.QnOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class OssConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public  QnOssUtil qnOssUtil(QnOssProperties qnOssProperties){
        log.info("文件上传配置类的参数:{}",qnOssProperties.getBucketName());
        log.info("七牛");
        return new QnOssUtil(qnOssProperties);
    }
}

配置对象QnOssProperties

这里通过@ConfigurationProperties(prefix = “sky.qnoss”)注解自动读取yaml文件,匹配sky.qnoss前缀对应的值给这些属性赋值。

package com.sky.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "sky.qnoss")
@Data
public class QnOssProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐