阿里云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: xxxxxxx
bucketName: xxxxxxxxxxxxxx
accessKeyId: xxxxxxxxxxxxxx
accessKeySecret: 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("."));
//上传文件到oss
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream); //文件上传方法
//获取文件访问地址
String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
//关闭ossClient
ossClient.shutdown();
return url;
}
}
service层调用
@Service
public class OSSFileServiceImpl extends ServiceImpl<MyFileMapper, MyFile> implements FileUploadService {
@Resource
private AliyunOssUtil aliyunOssUtil;
@Override
public Result saveFile(MultipartFile file) {
try{
String url = aliyunOssUtil.upload(file);
return Result.success(url);
}catch (Exception e){
e.printStackTrace();
return Result.error("文件上传失败,请联系管理员"+e.getMessage());
}
}
}