SpringBoot上传文件到阿里云OSS对象存储
文章目录
- 一、阿里云创建OSS
- 创建账号(省略)
- 开通对象存储服务,创建bucket
- 关闭阻止公共访问
- 修改读写权限为公共读(因为我是演示环境)
- 获取AccessKey(秘钥)
- 参照官方SDK文档
- 二、编写代码
- pom.xml引入oss起步依赖
- 单元测试
- 创建工具类
- 控制层
- 三、参考资料
一、阿里云创建OSS
可以免费使用3个月
创建账号(省略)
开通对象存储服务,创建bucket
点击右上角控制台
关闭阻止公共访问
修改读写权限为公共读(因为我是演示环境)
获取AccessKey(秘钥)
创建成功后,保存ID和Secret
参照官方SDK文档
左侧拉到最下面
打开帮助文档
二、编写代码
pom.xml引入oss起步依赖
<!--阿里云oss坐标-->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></dependency>
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>
单元测试
参考官方文档
获取endpoint
Demo.java
package com.itheima;import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyuncs.auth.StaticCredentialsProvider;import java.io.ByteArrayInputStream;
import java.io.FileInputStream;public class Demo {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
// EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();//获取AccessKey(秘钥)的值String ACCESS_KEY_ID = "LAI5t61RVvo4abxK3dY6Q";String ACCESS_KEY_SECRET = "lpw37mdszKd9Nc9b2jKXkroocLy";// 填写Bucket名称,例如examplebucket。String bucketName = "big-event-aqx";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "001.png";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。String region = "cn-shenzhen";// 创建OSSClient实例。
// ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// OSS ossClient = OSSClientBuilder.create()
// .endpoint(endpoint)
// .credentialsProvider(new StaticCredentialsProvider(new BasicCredentials(ACCESS_KEY_ID, ACCESS_KEY_SECRET)))
// .clientConfiguration(clientBuilderConfiguration)
// .region(region)
// .build();OSS ossClient = new OSSClientBuilder().build(endpoint, ACCESS_KEY_ID, ACCESS_KEY_SECRET);try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new FileInputStream("C:\\Users\\devops\\Desktop\\files\\001.png"));// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。// ObjectMetadata metadata = new ObjectMetadata();// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);// 上传字符串。PutObjectResult result = ossClient.putObject(putObjectRequest);} 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();}}}
}
创建工具类
utils/AliOssUtil.java
package com.itheima.utils;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 java.io.InputStream;public class AliOssUtil {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。private static final String ENDPOINT = "https://oss-cn-shenzhen.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
// EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();//获取AccessKey(秘钥)的值private static final String ACCESS_KEY_ID = "5t61RVvo4abxK3dY";private static final String ACCESS_KEY_SECRET = "w37mdszKd9Nc9b2jKX";// 填写Bucket名称,例如examplebucket。private static final String BUCKETNAME = "big-event-aqx";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
// String region = "cn-shenzhen";public static String uploadFile(String objectName, InputStream in) throws Exception {OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);String url = "https://"+BUCKETNAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, objectName, in);// 上传字符串。PutObjectResult result = ossClient.putObject(putObjectRequest);} 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 url;}
}
控制层
controller/FileUploadController.java
package com.itheima.controller;import com.itheima.pojo.Result;
import com.itheima.utils.AliOssUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class FileUploadController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws Exception {//把文件内容存储到本地磁盘String originalFileName = file.getOriginalFilename();//用uuid保证文件名唯一String fileName = UUID.randomUUID().toString()+originalFileName.substring(originalFileName.lastIndexOf("."));
// file.transferTo(new File("C:\\Users\\devops\\Desktop\\files\\" + fileName));String url = AliOssUtil.uploadFile(fileName,file.getInputStream());return Result.success(url);}
}
三、参考资料
https://www.bilibili.com/video/BV14z4y1N7pg?spm_id_from=333.788.player.switch&vd_source=0467ab39cc5ec5940fee22a0e7797575&p=38