一、实现思路:
1、maven导包
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun.sdk.oss}</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb-api}</version>
</dependency>//具体依赖可在阿里云的SDK的java使用文档中获取
2、在yml文件中配置Oss的环境,然后直接复制粘贴 AliOssUtil和AliOssProperties
3、通过获取文件原始名,截取文件名,uuid防覆盖,构建新文件名称objectname
4、调用String filePath=AliOssUtil.update(file.getBytes(),objectname)
return Result.success(filePath);
二、包含三个类(AliOssUtil,OssConfiguration, AliOssProperties)和一个yml配置:
(1)sky.commom.utiles(工具类,只有update方法用于上传文件)
```
package com.sky.utils;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
@Data
@AllArgsConstructor //自动为类的所有属性生成有参构造
@Slf4j
public class AliOssUtil {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
/**
* 文件上传
*
* @param bytes
* @param objectName
* @return
*/ public String upload(byte[] bytes, String objectName) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建PutObject请求。
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
//文件访问路径规则 https://BucketName.Endpoint/ObjectName StringBuilder stringBuilder = new StringBuilder("https://");
stringBuilder
.append(bucketName)
.append(".")
.append(endpoint)
.append("/")
.append(objectName);
log.info("文件上传到:{}", stringBuilder.toString());
return stringBuilder.toString();
}
}
```
(2)sky.setver.config.OssConfiguration(配置类,用于创建Oss对象并进行赋值)
package com.sky.config;
import com.sky.entity.Employee;
import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*配置类,用于创建0ss对象*/
@Configuration //一个类中声明一个和多个 @Bean 标记的方法,并且这些方法被 Spring 容器管理用于生成 Bean 定义以及在运行时这些 Bean 的服务请求
@Slf4j
public class OssConfiguration {
@Bean
@ConditionalOnMissingBean
public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
log.info("开始创建Oss文件存储对象{}",aliOssProperties);
AliOssUtil aliOssUtil = new AliOssUtil(aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName());
return aliOssUtil;
}
}
(3)sky.commom.properties(Oss属性对象)
```
package com.sky.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "sky.alioss")//表示属性由对应的yml文件中的sky.alioss赋值
@Data
public class AliOssProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
```
(4)application.yml和application-dev.yml
```
//application.yml
spring:
profiles:
active: dev//开发环境
main:
allow-circular-references: true //驼峰命名开关
datasource:
druid:
driver-class-name: ${sky.datasource.driver-class-name}
url: jdbc:mysql://${sky.datasource.host}:${sky.datasource.port}/${sky.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: ${sky.datasource.username}
password: ${sky.datasource.password}
//application-dev.yml
sky:
alioss:
endpoint: "对应的endpoint" 例如:"oss-cn-hangzhou.aliyuncs.com"
access-key-id: "对应的access-key-id"
access-key-secret: "对应的access-key-secret"
bucket-name: "对应的bucket-name"
```
上传文件实现模块代码:
```
package com.sky.controller.admin;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.ApiOperation;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;
@Slf4j
@RestController
@RequestMapping("/admin/common")
public class CommonController {
@Autowired
AliOssUtil aliOssUtil;
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> FileUpload(@RequestBody MultipartFile file){
log.info("文件上传,文件名:{}",file.getOriginalFilename());
/*调用Alioss工具类*/
try {
/*获取原始文件名*/
String originalFilename = file.getOriginalFilename();
/*获取原始文件名后缀*/
String extension = originalFilename.substring(originalFilename.lastIndexOf('.'));
/*构造新文件名称*/
String objectname =UUID.randomUUID().toString()+ extension;
String filePath=aliOssUtil.upload(file.getBytes(),objectname);
return Result.success(filePath);
} catch (IOException e) {
log.info("文件上传失败{}",e);
}
return null;
}
}
```