一、配置
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、绑定配置类属性
-
@ConfigurationProperties
: 这个注解用于指定将配置属性绑定到这个类上。
- 通过
prefix = "like.oss"
指定了配置属性的前缀,即配置文件中以like.oss
开头的属性会与这个类中的字段进行绑定。
-
@Configuration
: 这个注解表示这是一个Spring配置类,用于定义Bean。Spring会扫描这个类中的Bean定义,并将其注册到应用上下文中。
-
@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 ;
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;
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);
}
stringBuilder
.append(aliOssConfigProperties.getBucketName())
.append(".")
.append(aliOssConfigProperties.getEndpoint())
.append("/")
.append(objectName);
return stringBuilder.toString();
}
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);
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;
@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);
}
}