阿里云OSS对象云储存入门操作
阿里云OSS服务
1.创建OSS数据桶
首先在阿里云对象存储服务OSS中创建好对应的数据桶,我的是gezishan-bucket1
2.创建AccessKey
认识AccessKey?
访问密钥AccessKey(简称AK)是阿里云提供给用户的永久访问凭据,由AccessKey ID和AccessKey Secret组成的一组密钥对。
- AccessKey ID:用于标识用户。
- AccessKey Secret:是一个用于验证您拥有该AccessKey ID的密码。
AccessKey ID和AccessKey Secret根据算法由访问控制(RAM)生成,阿里云对AccessKey ID和AccessKey Secret的存储及传输均进行加密。
AccessKey不用于控制台登录,而是用于通过开发工具(API、CLI、SDK、Terraform等)访问阿里云时,发起的请求会携带AccessKey ID和AccessKey Secret加密请求内容生成的签名,进行身份验证及请求合法性校验。
AccessKey最佳实践
-
强烈建议不要给阿里云账号(主账号)创建AccessKey。
阿里云账号(主账号)默认拥有当前账号下所有云资源的Administrator权限,且无法修改。阿里云账号(主账号)的AccessKey泄露会威胁该账号下所有资源的安全。为保证账号安全,强烈建议您不要给阿里云账号(主账号)创建AccessKey,建议您创建专用于API访问的RAM用户并创建对应的AccessKey,完成最小化授权后,通过编程的方式访问阿里云资源。
-
减少创建永久AccessKey,优先采用STS Token临时凭证方案,降低凭证泄露的风险。
-
妥善保管AccessKey ID和AccessKey Secret,不要将AccessKey信息随意分享给其他人,或记录在公开的文档中。
-
避免在代码中写入明文AccessKey信息。
-
AccessKey不再使用时及时禁用。
-
定期轮转AccessKey,一个RAM用户启用一把AccessKey后另一把仅用于轮转。
-
为RAM用户仅授予必要的最小权限。
操作步骤
- 登录RAM控制台。
- 在左侧导航栏,选择****身份管理** > *用户***。
- 在用户页面,单击目标RAM用户名称。
- 在认证管理页签下的AccessKey区域,单击创建AccessKey。
授权访问
创建AccessKey
相当于创建了一个子用户,要想能访问指定的数据桶,还要为指定的子用户授权,
后续每次上传文件都要携带AccessKeyId
进行鉴权,若该AccessKeyId
没有访问权限项目将报错。
选择授权的子用户
3.项目中使用OSS云服务
这是阿里云官网提供的demo
:
import java.io.*;
import java.util.Random;import com.aliyun.oss.*;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;public class OssJavaSdkQuickStart {/** 生成一个唯一的 Bucket 名称 */public static String generateUniqueBucketName(String prefix) {// 获取当前时间戳String timestamp = String.valueOf(System.currentTimeMillis());// 生成一个 0 到 9999 之间的随机数Random random = new Random();int randomNum = random.nextInt(10000); // 生成一个 0 到 9999 之间的随机数// 连接以形成一个唯一的 Bucket 名称return prefix + "-" + timestamp + "-" + randomNum;}public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException {// Endpoint以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com,其它Region请按实际情况填写。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";String bucketName = generateUniqueBucketName("demo");// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。// 关于OSS支持的Region与Endpoint的对应关系,请参见https://www.alibabacloud.com/help/zh/oss/user-guide/regions-and-endpoints。String region = "cn-hangzhou";// 从环境变量中获取访问凭证。运行本代码示例之前,请先配置环境变量EnvironmentVariableCredentialsProvider credentialsProvider =CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 创建OSSClient实例。// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();// 显式声明使用 V4 签名算法clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient = OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).region(region).build();try {// 1. 创建存储空间(Bucket)ossClient.createBucket(bucketName);System.out.println("1. Bucket " + bucketName + " 创建成功。");// 2. 上传文件String objectName = "exampledir/exampleobject.txt";String content = "Hello OSS";ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));System.out.println("2. 文件 " + objectName + " 上传成功。");// 3. 下载文件OSSObject ossObject = ossClient.getObject(bucketName, objectName);InputStream contentStream = ossObject.getObjectContent();BufferedReader reader = new BufferedReader(new InputStreamReader(contentStream));String line;System.out.println("3. 下载的文件内容:");while ((line = reader.readLine()) != null) {System.out.println(line);}contentStream.close();// 4. 列出文件System.out.println("4. 列出 Bucket 中的文件:");ObjectListing objectListing = ossClient.listObjects(bucketName);for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {System.out.println(" - " + objectSummary.getKey() + " (大小 = " + objectSummary.getSize() + ")");}// 5. 删除文件ossClient.deleteObject(bucketName, objectName);System.out.println("5. 文件 " + objectName + " 删除成功。");// 6. 删除存储空间(Bucket)ossClient.deleteBucket(bucketName);System.out.println("6. Bucket " + bucketName + " 删除成功。");} 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 | IOException 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();}}}
}
预配置
引入依赖
然后再项目的pom.xml
中导入依赖:
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></dependency>
配置项
在实际开发中通常将一些配置信息在application.yml
中配置。
需要配置关键的4个要素,分别是endpoint
(服务器域名),bucketName
(数据桶名),accessKeyId
(连接秘钥),accessKeySecret
(秘钥密码)
aliyun:oss:endpoint: xxxxxxxbucketName: xxxxxxxxxxxxxxaccessKeyId: xxxxxxxxxxxxxxaccessKeySecret: xxxxxxxxxxxxxxxxxxxxxxx
入门API
连接OSS
对象
OSS ossclick = new OSClientBuilder().build(String endpoint,String accessKeyId,String accessKeySecret);
//上面三个参数均为String类型,含义见上
文件上传方法
OSS.putObject(String bucketName,String fileName,InputStream inputStream);
/*
bucketName 数据桶名
fileName 上传后的文件名
inputStream 待上传文件输入流
*/
关闭连接
OSS.shutdown()
工具类
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;public String upload(MultipartFile file) throws IOException {//获取上传文件的输入流InputStream inputStream = file.getInputStream();//设置文件名,避免覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到ossOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream); //文件上传方法//获取文件访问地址String url = "https://" + bucketName + "." + endpoint + "/" + fileName;//关闭ossClientossClient.shutdown();return url;}
}
service层调用
@Service
public class OSSFileServiceImpl extends ServiceImpl<MyFileMapper, MyFile> implements FileUploadService {@Resourceprivate AliyunOssUtil aliyunOssUtil;@Overridepublic Result saveFile(MultipartFile file) {try{String url = aliyunOssUtil.upload(file);return Result.success(url);}catch (Exception e){e.printStackTrace();return Result.error("文件上传失败,请联系管理员"+e.getMessage());}}
}