1、任务描述
使用SpringBoot结合阿里云的SDK,完成一个能够接受用户上传的图片或文件,并返回存储路径的接口。
2、前提
需要先开启阿里云的oss服务,并且申请用户访问凭证、创建存储空间。
3、实现步骤
1、导入SpringBoot依赖
<!-- 阿里oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
2、将所需的变量写到配置文件中
aliyunoss:
accessKeyId: 省略
accessKeySecret: 省略
endpoint: 省略
bucketName: 省略
3、创建配置类。
这里主要为了将后面经常使用的OSS对象进行初始化。熟练之后也可自行封装工具类。
@Configuration
@Slf4j
@Data
public class AliyunOssConfig {
//Ram用户访问的密钥---配置访问凭证
@Value("${aliyunoss.accessKeyId}")
public String accessKeyId;
@Value("${aliyunoss.accessKeySecret}")
public String accessKeySecret;
//Bucket所在地域对应的Endpoint--创建OSSClient实例
@Value("${aliyunoss.endpoint}")
public String endpoint;
//Bucket名称--存储空间
@Value("${aliyunoss.bucketName}")
public String bucketName;
//配置访问凭证(这里用长期的方式)
private CredentialsProvider createCredentialsProvider(){
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
log.info("初始化登录凭证成功,参数如下");
log.info("accessKeyId:"+accessKeyId);
log.info("accessKeySecret:"+accessKeySecret);
return credentialsProvider;
}
//创建ossclient客户端
@Bean
public OSS ossclientInit(){
OSS ossClient = new OSSClientBuilder().build(endpoint,createCredentialsProvider());
log.info("阿里云oss客户端初始化完成");
return ossClient;
}
}
4、编写接口
解析:
在阿里云的SDK中,可以看到核心的代码为下图所示。
第一步为:创建PutObjectRequest对象,这里传递的参数依次是存储空间名称(bucketName)、上传到oss下的完整路径(objectName),即文件路径+文件名、文件输入流(inputStream),这个是要上传的文件转换成流对象。
第二步为:使用OSS对象发起调用。这个对象在前面配置类中已经初始化并注入Spring容器中了,需要时可以直接注入。
最后要返回的是文件url,阿里云调用完的结果对象并没有返回对应存储的url,这里自己手动封装。格式为: https://+bucketName+endpoint+文件路径+文件名
代码实现:
@RestController
@RequestMapping
public class FileController {
@Autowired
private OSS ossClient;
// Bucket名称。
@Value("${aliyunoss.bucketName}")
private String bucketName ;
//Bucket所在地域对应的Endpoint--创建OSSClient实例
@Value("${aliyunoss.endpoint}")
public String endpoint;
@RequestMapping()
public String testController(MultipartFile file){
if(file != null){
try {
//由于阿里云需要的SDK需要的是File类型,所以需要将接受的File类型转换成File
String newfileName="D://"+file.getOriginalFilename();
File newfile=new File(newfileName);
file.transferTo(newfile);
//创建文件输入流
InputStream inputStream = new FileInputStream(newfile);
// 创建PutObjectRequest对象。
// 这里的saveUrl包含保存的路径名+文件名
String saveUrl="test/"+file.getOriginalFilename();
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,saveUrl, inputStream);
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
System.out.println("请求的返回结果是"+result);
//封装返回结果
return "https://"+bucketName+"."+endpoint+"/"+saveUrl;
} 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());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
return "error";
}
}
4、结果
用swagger即可测试该接口。
可以看到成功返回了上传的文件路径,通过该路径就可以访问到对应图片或文件了。
在对应的阿里云控制台也能看到上传的图片