Spring Boot入门样例-522-uploader整合七牛云和阿里云OSS上传图片

Spring Boot入门样例-522-uploader整合七牛云和阿里云OSS上传图片

如果项目使用多个云存储,我们可以在配置文件中配置多个。本demo演示使用工厂模式无缝切换。

前言

本Spring Boot入门样例准备工作参考:

pox.xml

必要的依赖如下,具体参见该项目的pox.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
        </dependency>
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>[7.2.0, 7.2.99]</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.4</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

配置文件

resources/application.yml配置内容

uploader:
  type: 2
  qiniu:
    accessKey: 0u4ZFxeExxxx
    secretKey: 3bqtpy8xxxx
    bucket: jiajiayoupin
    domain: http://img.xxx.com
    region: -1
  aliyun:
    address: http://static.xxxx.com
    end-point: oss-cn-shenzhen.aliyuncs.com
    access-key: LTAIxxxx
    secret-key: z80txxx
    bucket: haixxxx

代码解析

UploaderFactory.java 如下 工厂模式

@Slf4j
@Component
public class UploaderFactory {
    @Value("${uploader.type}")
    private Integer type;

    @Autowired
    private QiniuUploader qiniuUploader;

    @Autowired
    private AliyunOssUploader aliyunOssUploader;

    /**
     * 
     * @author Funsonli
     * @date 2019/10/30
     * @return
     */
    public Uploader getUploader() {
        if (type == 1) {
            return qiniuUploader;
        } else if (type == 2) {
            return aliyunOssUploader;
        } else{
            throw new RuntimeException("暂不支持该配置,请检查");
        }
    }

    /**
     *
     * @author Funsonli
     * @date 2019/10/30
     * @return
     */
    public Uploader getUploader(Integer type) {
        this.type = type;
        return getUploader();
    }
}

UploaderFactory.java 如下 工厂模式

public interface Uploader {
    /**
     *
     * @author Funsonli
     * @date 2019/10/30
     * @param file 文件流
     * @param key
     * @return
     */
    String uploadInputStream(InputStream file, String key);

}

AliyunOssUploader.java 如下

@Slf4j
@Component
public class AliyunOssUploader implements Uploader {

    /** oss处访问图片的 url */
    @Value("${uploader.aliyun.address}")
    private String address;

    /** oss的 endpoint */
    @Value("${uploader.aliyun.end-point}")
    private String endPoint;

    @Value("${uploader.aliyun.access-key}")
    private String accessKey;

    @Value("${uploader.aliyun.secret-key}")
    private String secretKey;

    /** oss的储存名称 */
    @Value("${uploader.aliyun.bucket}")
    private String bucket;

    /**
     * 文件流上传
     * @param file 文件名
     * @param key  文件名
     * @return
     */
    @Override
    public String uploadInputStream(InputStream file, String key) {

        OSSClient ossClient = new OSSClient(endPoint, new DefaultCredentialProvider(accessKey, secretKey), null);
        try {
            ossClient.putObject(bucket, key, file);
            ossClient.shutdown();
            return address + "/" + key;
        } catch (Exception ex) {
            throw new RuntimeException("上传文件出错,请检查配置" + ex.toString());
        }
    }

}

QiniuUploader.java 如下

@Slf4j
@Component
public class QiniuUploader implements Uploader {

    /**
     * 生成上传凭证,然后准备上传
     */
    @Value("${uploader.qiniu.accessKey}")
    private String accessKey;

    @Value("${uploader.qiniu.secretKey}")
    private String secretKey;

    @Value("${uploader.qiniu.bucket}")
    private String bucket;

    @Value("${uploader.qiniu.domain}")
    private String domain;

    @Value("${uploader.qiniu.region}")
    private Integer region;

    /**
     * 华东	Region.region0(), Region.huadong()
     * 华北	Region.region1(), Region.huabei()
     * 华南	Region.region2(), Region.huanan()
     * 北美	Region.regionNa0(), Region.beimei()
     * 东南亚	Region.regionAs0(), Region.xinjiapo()
     */
    public Configuration getConfiguration(){

        Configuration cfg = null;
        switch (region) {
            case 0:
                cfg = new Configuration(Region.region0());
                break;
            case 1:
                cfg = new Configuration(Region.region1());
                break;
            case 2:
                cfg = new Configuration(Region.region2());
                break;
            case 3:
                cfg = new Configuration(Region.regionNa0());
                break;
            case 4:
                cfg = new Configuration(Region.regionAs0());
                break;
            default:
                cfg = new Configuration(Region.autoRegion());
        }

        return cfg;
    }

    /**
     * 文件流上传
     * @param file 文件名
     * @param key  文件名
     * @return
     */
    @Override
    public String uploadInputStream(InputStream file, String key) {

        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            UploadManager uploadManager = new UploadManager(getConfiguration());
            Response response = uploadManager.put(file, key, upToken, null, null);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            return domain + "/" + putRet.key;
        } catch (QiniuException ex) {
            Response r = ex.response;
            throw new RuntimeException("上传文件出错,请检查七牛云配置," + r.toString());
        }
    }

    /**
     * 以UUID重命名
     *
     * @param fileName
     * @return
     */
    public String rename(String fileName) {
        String extName = fileName.substring(fileName.lastIndexOf("."));
        return UUID.randomUUID().toString().replace("-", "") + extName;
    }
}

CommonController.java 如下 upload直接上传文件

@Slf4j
@RestController
@RequestMapping("/bootan/common")
public class CommonController {
    @Autowired
    private UploaderFactory uploaderFactory;

    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    public BaseResult upload(@RequestParam(required = false) MultipartFile file,
                             HttpServletRequest request) {

        String result = null;
        String fileName = rename(file.getOriginalFilename());
        try {
            InputStream inputStream = file.getInputStream();
            result = uploaderFactory.getUploader().uploadInputStream(inputStream, fileName);
        } catch (Exception e) {
            log.error(e.toString());
            return BaseResult.error(e.toString());
        }

        return BaseResult.success(result);
    }

    /**
     * 以UUID重命名
     *
     * @param fileName
     * @return
     */
    public String rename(String fileName) {
        String extName = fileName.substring(fileName.lastIndexOf("."));
        return UUID.randomUUID().toString().replace("-", "") + extName;
    }

}

运行

点击运行

在postman中通过如下方式上传

图片

修改配置文件中的type,再次上传,到了其他云存储。

参考

  • Spring Boot入门样例源代码地址 https://github.com/funsonli/spring-boot-demo
  • Bootan源代码地址 https://github.com/funsonli/bootan
  • 七牛官方SDK Java https://developer.qiniu.com/kodo/sdk/1239/java#upload-config
  • 阿里云官方SDK Java https://help.aliyun.com/document_detail/84781.html

如果您喜欢本Spring Boot入门样例和样例代码,请点赞Star

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值