Springboot集成Aliyun-OSS

一、配置

1、引入依赖

<dependency>  
    <groupId>com.aliyun.oss</groupId>  
    <artifactId>aliyun-sdk-oss</artifactId>  
    <version>3.10.2</version>  
</dependency>

<dependency>  
    <groupId>org.apache.commons</groupId>  
    <artifactId>commons-lang3</artifactId>  
</dependency>  
<dependency>  
    <groupId>com.google.guava</groupId>  
    <artifactId>guava</artifactId>  
    <version>30.1.1-jre</version>  
</dependency>
<dependency>  
    <groupId>org.projectlombok</groupId>  
    <artifactId>lombok</artifactId>  
    <optional>true</optional>  
</dependency>

2、配置Asskey

like:  
  oss:  
    endpoint: oss-cn-beijing.aliyuncs.com  
    accessKeyId: LTAI5tHfNr2QehiFB7sAFctj  
    accessKeySecret: FOmTPm8ObaIzvfR3jFtYD10ibryhan  
    bucketName: like1117-bucket

二、整合

1、绑定配置类属性

  1. @ConfigurationProperties: 这个注解用于指定将配置属性绑定到这个类上。

    1. 通过prefix = "like.oss"指定了配置属性的前缀,即配置文件中以like.oss开头的属性会与这个类中的字段进行绑定。
  2. @Configuration: 这个注解表示这是一个Spring配置类,用于定义Bean。Spring会扫描这个类中的Bean定义,并将其注册到应用上下文中。

  3. @Setter, @Getter, @NoArgsConstructor, @ToString: 这些是Lombok注解,用于自动生成setter、getter方法、无参构造方法和toString方法,减少样板代码的编写。

import lombok.Getter;  
import lombok.NoArgsConstructor;  
import lombok.Setter;  
import lombok.ToString;  
import org.springframework.boot.context.properties.ConfigurationProperties;  
import org.springframework.context.annotation.Configuration;  

@Setter  
@Getter  
@NoArgsConstructor  
@ToString  
@Configuration  
@ConfigurationProperties(prefix = "like.oss")  
public class AliOssConfigProperties {  
  
    /**  
     * 域名站点  
     */  
    private String endpoint ;  
  
    /**  
     * 秘钥Id  
     */    private String accessKeyId ;  
  
    /**  
     * 秘钥  
     */  
    private String accessKeySecret ;  
  
    /**  
     * 桶名称  
     */  
    private String bucketName ;  
  
}

2、创建OSSClient实例

import com.aliyun.oss.OSS;  
import com.aliyun.oss.OSSClientBuilder;  
import com.aliyun.oss.model.CannedAccessControlList;  
import com.aliyun.oss.model.CreateBucketRequest;  
import com.aliyun.oss.model.SetBucketLoggingRequest;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
@Slf4j  
@Configuration  
public class OssAliyunAutoConfig {  
  
    @Autowired  
    AliOssConfigProperties aliOssConfigProperties;  
  
    @Bean  
    public OSS ossClient(){  
        log.info("-----------------开始创建OSSClient--------------------");  
        OSS ossClient = new OSSClientBuilder().build(aliOssConfigProperties.getEndpoint(),  
                aliOssConfigProperties.getAccessKeyId(), aliOssConfigProperties.getAccessKeySecret());  
        //判断容器是否存在,不存在就创建  
        if (!ossClient.doesBucketExist(aliOssConfigProperties.getBucketName())) {  
            ossClient.createBucket(aliOssConfigProperties.getBucketName());  
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(aliOssConfigProperties.getBucketName());  
            //设置问公共可读  
            createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);  
            ossClient.createBucket(createBucketRequest);  
        }  
  
        //添加客户端访问日志  
        SetBucketLoggingRequest request = new SetBucketLoggingRequest(aliOssConfigProperties.getBucketName());  
        // 设置存放日志文件的存储空间。  
        request.setTargetBucket(aliOssConfigProperties.getBucketName());  
        // 设置日志文件存放的目录。  
        request.setTargetPrefix(aliOssConfigProperties.getBucketName());  
        ossClient.setBucketLogging(request);  
  
        log.info("-----------------结束创建OSSClient--------------------");  
        return ossClient;  
    }  
}

3、自定义上传接口

import com.aliyun.oss.ClientException;  
import com.aliyun.oss.OSS;  
import com.aliyun.oss.OSSException;  
import com.aliyun.oss.model.CannedAccessControlList;  
import com.aliyun.oss.model.DeleteObjectsRequest;  
import com.aliyun.oss.model.PutObjectRequest;  
import com.aliyun.oss.model.PutObjectResult;  
import com.google.common.collect.Lists;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Component;  
  
import java.io.InputStream;  
import java.util.List;  
  
@Slf4j  
@Component  
public class OSSAliyunFileStorageService {  
  
    @Autowired  
    OSS ossClient;  
  
    @Autowired  
    AliOssConfigProperties aliOssConfigProperties;  
  
    /**  
     * 上传文件  
     * @param objectName  文件名  
     * @param inputStream  文件流对象  
     * @return  
     */  
    public String store(String objectName, InputStream inputStream) {  
        //文件读取路径  
        String url = null;  
        // 判断文件  
        if (inputStream == null) {  
            log.error("上传文件:objectName{}文件流为空", objectName);  
            return url;  
        }  
        log.info("OSS文件上传开始:{}", objectName);  
        try {  
            String bucketName = aliOssConfigProperties.getBucketName();  
            // 上传文件  
            PutObjectRequest request = new PutObjectRequest(bucketName, objectName, inputStream);  
  
            PutObjectResult result = ossClient.putObject(request);  
            // 设置权限(公开读)  
            ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);  
            if (result != null) {  
                log.info("OSS文件上传成功:{}", objectName);  
  
            }  
        } catch (OSSException oe) {  
            log.error("OSS文件上传错误:{}", oe);  
        } catch (ClientException ce) {  
            log.error("OSS文件上传客户端错误:{}", ce);  
        }  
        //文件访问路径规则 https://like1117-bucket.oss-cn-beijing.aliyuncs.com/ab9abc50-428d-4bfd-829f-b66847935a93.jpg        StringBuilder stringBuilder = new StringBuilder("https://");  
        stringBuilder  
                .append(aliOssConfigProperties.getBucketName())  
                .append(".")  
                .append(aliOssConfigProperties.getEndpoint())  
                .append("/")  
                .append(objectName);  
        return stringBuilder.toString();  
    }  
  
    /**  
     * 根据url删除文件  
     * @param pathUrl   url地址(全路径)  
     */  
    public void delete(String pathUrl) {  
        String prefix = "https://"+aliOssConfigProperties.getBucketName()+"."+ aliOssConfigProperties.getEndpoint()+"/";  
        String key = pathUrl.replace(prefix, "");  
        List<String> keys = Lists.newArrayList();  
        keys.add(key);  
        // 删除Objects  
        ossClient.deleteObjects(new DeleteObjectsRequest(aliOssConfigProperties.getBucketName()).withKeys(keys));  
  
    }  
}

4、上传示例接口

import com.like.base.ResponseResult;  
import com.like.config.OSSAliyunFileStorageService;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestPart;  
import org.springframework.web.bind.annotation.RestController;  
import org.springframework.web.multipart.MultipartFile;  
  
import javax.imageio.ImageIO;  
import java.awt.image.BufferedImage;  
import java.util.UUID;  
  
@RestController  
@RequestMapping("/common")  
@Slf4j  
public class CommonController {  
  
    @Autowired  
    private OSSAliyunFileStorageService fileStorageService;  
  
    /**  
     * 文件上传  
     *  
     * @param file 文件  
     * @return 上传结果  
     * @throws Exception 异常  
     */  
    @PostMapping("/upload")  
    public ResponseResult<String> upload(  
            @RequestPart("file") MultipartFile file) throws Exception {  
  
        // 校验是否为图片文件  
        try {  
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());  
        } catch (Exception e) {  
            return ResponseResult.error();  
        }  
  
        if (file.getSize() == 0) {  
            throw new RuntimeException("上传图片不能为空");  
        }  
  
        // 获得原始文件名  
        String originalFilename = file.getOriginalFilename();  
        // 获得文件扩展名  
        String extension = originalFilename.substring(originalFilename.lastIndexOf("."));  
        String fileName = UUID.randomUUID().toString() + extension;  
  
        String filePath = fileStorageService.store(fileName, file.getInputStream());  
  
        return ResponseResult.success("", filePath);  
    }  
  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值