目录
一、封装
目录结构
1. 创建一个空项目
2. 导入依赖
3. 编写 Java 类及配置文件
3.1 编写 OssProperties 类
3.2 编写 OssTemplate 类
3.3 编写 AliyunOssAutoConfig 类
3.4 创建 spring.factories 文件
4. install
二、测试
目录结构
1. 创建一个新的空项目
2. 导入依赖
3. 创建 yml 文件
4. 编写启动类
5. 编写 TestController 类
6. 运行启动类进行测试
这里以阿里云的 OSS 对象存储为例进行制作,首先开通 OSS 存储服务
一、封装
目录结构
1. 创建一个空项目
2. 导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.11</version>
</parent>
<dependencies>
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--阿里云oss依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
</dependencies>
注意:阿里云 OSS 依赖从这里获取
3. 编写 Java 类及配置文件
3.1 编写 OssProperties 类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private String url;
}
注意: 此时 @ConfigurationProperties 注解爆红先不管
3.2 编写 OssTemplate 类
import com.aliyunoss.properties.OssProperties;
import java.io.InputStream;
public class OssTemplate {
private OssProperties ossProperties;
public OssTemplate(OssProperties ossProperties) {
this.ossProperties = ossProperties;
}
public String uploadFile(String fileName, InputStream inputStream) {
}
}
将文档中上传文件流中的代码拷贝到 uploadFile 方法中,并且修改
修改完成后的 OssTemplate 类
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyunoss.properties.OssProperties;
import java.io.InputStream;
public class OssTemplate {
private OssProperties ossProperties;
public OssTemplate(OssProperties ossProperties) {
this.ossProperties = ossProperties;
}
public String uploadFile(String fileName, InputStream inputStream) {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = ossProperties.getEndpoint();
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = ossProperties.getAccessKeyId();
String accessKeySecret = ossProperties.getAccessKeySecret();
// 填写Bucket名称,例如examplebucket。
String bucketName = ossProperties.getBucketName();
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String suffixName = fileName.substring(fileName.lastIndexOf("."));
String objectName = System.currentTimeMillis() + suffixName;
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 设置该属性可以返回response。如果不设置,则返回的response为空。
putObjectRequest.setProcess("true");
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
// 如果上传成功,则返回200。
System.out.println(result.getResponse().getStatusCode());
} 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();
}
}
return ossProperties.getUrl() + objectName;
}
}
3.3 编写 AliyunOssAutoConfig 类
import com.aliyunoss.properties.OssProperties;
import com.aliyunoss.template.OssTemplate;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
/**
* EnableConfigurationProperties:项目启动的时候,自动加载SmsProperties,创建实例
*/
@EnableConfigurationProperties({OssProperties.class})
public class AliyunOssAutoConfig {
/**
* 将当前的SmsTempate交给Spring容器管理
*/
@Bean
public OssTemplate ossTemplate(OssProperties ossProperties) {
return new OssTemplate(ossProperties);
}
}
3.4 创建 spring.factories 文件
文件内容为
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.aliyunoss.AliyunOssAutoConfig
文件位置为: resources\META-INF\spring.factories
4. install
二、测试
目录结构
1. 创建一个新的空项目
2. 导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.11</version>
</parent>
<dependencies>
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--刚刚我们制作好的oss启动器的依赖-->
<dependency>
<groupId>org.example</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3. 创建 yml 文件
aliyun:
oss:
endpoint: # 在这里设置你的 endpoint
accessKeyId: # 在这里设置你的 accessKeyId
accessKeySecret: # 在这里设置你的 accessKeySecret
bucketName: # 在这里设置你的 bucketName
url: # 在这里设置你的 url
4. 编写启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
5. 编写 TestController 类
import com.aliyunoss.template.OssTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@RestController
@RequestMapping("/test")
public class TestController {
@Resource
private OssTemplate ossTemplate;
@GetMapping("/testUpload1")
public String testUpload1() throws IOException {
String filePath = "C:\\Users\\A\\Desktop\\bt.jpg";
File file = new File(filePath);
return ossTemplate.uploadFile(file.getName(), Files.newInputStream(file.toPath()));
}
@PostMapping("/testUpload2")
public String testUpload2(MultipartFile file) throws IOException {
return ossTemplate.uploadFile(file.getName(), file.getInputStream());
}
}
6. 运行启动类进行测试
到 OSS 管理控制台查看