1.1:什么是阿里云的OSS
阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。您可以通过本文档提供的简单的REST接口,在任何时间、任何地点、任何互联网设备上进行上传和下载数据。基于OSS,您可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。
1.2:OSS定价
不到五块钱半年,适合于学习使用,ps: 我不亏呜呜...1.3:官方参考文档
官方参考文档:https://help.aliyun.com/product/31815.html
1.4:开通对象存储OSS服务
-
1:访问阿里云官网: 阿里云官网
-
2: 点击右上角登录:
如上图所示,该页面为登录成功页面,如果没有使用过则可以进行注册或支付宝扫码登陆哦。
-
3:登录成功之后,选择控制台
-
4: 进入控制台点击产品与服务,选择搜索对象存储OSS
-
如果你没有开通请选择开通
-
勾选点击立即开通
-
购买oss对象包,点击购买资源包
-
点击购买资源包后如下界面
-
点击立即购买
-
支付成功,回到管理控制台,查看得到购买记录
1.5:创建与删除空间Bucket
注意:Bucket 创建成功后,您所选择的 存储类型、区域 不支持变更。
-
创建成功如下
-
查看 Bucket 相关信息。Endpoint:上传文件时使用Bucket域名:查看文件时使用>
-
直接预览,上传文件点击即可
-
上传文件点击即可
1.6:设置 Bucket 公共读权限
- 点击图片文件名 Logo.png ,打开的右侧有个 URL,URL带上签名参数可以浏览器直接访问,会自动下载。但是如果不带签名无法访问,提示如下没有权限:
- 无法访问是因为默认文件都是私有的,没有公共读权限。而我们可以将当前 Bucket 设置为公共读权限,这样就可以不带签名就可以访问。
1.7: 创建 RAM 账号-AccessKey
阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,
请登录 https://ram.console.aliyun.com 创建RAM账号。
* 1.8:创建用户
- 访问 https://ram.console.aliyun.com/users/new ,输入登录名称、显示名称,勾选 编程访问 ,点击 确定
- 创建成功后,将查看到的 AccessKeyID 、AccessKeySecret 复制保存下来,在Java代码中要使用它操作OSS,不然页面关闭后将无法再次获取到此信息。如果没有记录下来,参见下一节 创建新的AccessKey
在此处创建Accesskey,然后保存起来,届时Java中会用到。
1.9:用户授权
对指定用户添加管理对象存储服务(OSS)服务。
- 访问 https://ram.console.aliyun.com/users 点击 添加权限
然后进入配置
2.0: java依赖
添加 OSS SDK 依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
2.1:创建配置类
package com.qycq.common.pojo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* As we all know, where there is Wolong,there must be phoenix!
*
* @author 七月初七
* @version 1.0
* @date 2021/11/15 1:13
*/
@Data
@Component
@ConfigurationProperties(prefix = "seven.oss")
public class OssProperties {
/**
* 阿里云配置类
*/
private AliyunProperties aliyun;
}
2.2:创建阿里云配置类
package com.qycq.common.pojo;
import lombok.Data;
/**
* As we all know, where there is Wolong,there must be phoenix!
*
* @author 七月初七
* @version 1.0
* @date 2021/11/15 1:13
*/
@Data
public class AliyunProperties {
/**
* 阿里云端点配置
*/
private String endpoint;
/**
* 用户accessId
*/
private String accessKeyId;
/**
* 用户密码加密
*/
private String accessKeySecret;
/**
* 存储空间名称
*/
private String bucketName;
/**
* Bucket域名,访问文件时作为url前缀
*/
private String bucketDomain;
}
2.3:配置yml文件
# oss配置
seven:
oss:
aliyun:
endpoint: http://oss-cn-guangzhou.aliyuncs.com # oss端点
accessKeyId: LTAI5tGGCf6NncxdXCf1ubq7
accessKeySecret: SDofwzVRVFgIczWEH23ZW1BnJxP3Ib
bucketName: dubboseven # 存储空间名称
# Bucket域名 访问文件时作为URL前缀,注意前面加上 https 和结尾加上 /
bucketDomain: https://dubboseven.oss-cn-guangzhou.aliyuncs.com/
这个是我的,大家可以换成自己的
- 创建枚举类
文件可能会有头像和其他,所以需要分开存储
package com.qycq.common.enums;
/**
* As we all know, where there is Wolong,there must be phoenix!
*<p>
* 阿里云存储枚举类
*</p>
* @author 七月初七
* @version 1.0
* @date 2021/11/15 1:19
*/
public enum AliyunEnum {
//此处例如文章和头像
ARTICLE, USER;
}
2.4: 工具类
package com.qycq.common.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.comm.ResponseMessage;
import com.aliyun.oss.model.PutObjectResult;
import com.qycq.common.enums.OssEnum;
import com.qycq.common.utils.CommonResult;
import com.qycq.common.pojo.AliyunProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date;
import java.util.Objects;
import java.util.UUID;
/**
* @Author: 七月初七
* @Date: 2021-10-09-16:47
* @Description: 阿里云文件上传下载工具类
*/
@Slf4j
public class AliyunOssUtil {
/**
* 文件上传: 上传成功后返回文件路径,例如
* https://dubboseven.oss-cn-guangzhou.aliyuncs.com/user/2021-10-09 17:30:49/317b685c1cbd42c39b6ecae22962fe13.xlsx
*
* @param ossEnum 文件类型
* @param file 文件上传
* @param aliyunProperties 配置类
* @return
*/
public static CommonResult<?> uploadFileToOss(OssEnum ossEnum, MultipartFile file, AliyunProperties aliyunProperties) {
/**
* 获取文件夹名称,上传文件所在目录名,当天上传的文件放到当天日期的目录下
*/
String folderName = ossEnum.name().toLowerCase() + "/" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
log.info("该图片的文件夹名称为:{}", folderName);
/**
* 通过uuid生产随机名称,将其与文件名进行拼接保持唯一。
*/
String fileName = UUID.randomUUID().toString().replace("-", "");
/**
* 获取原始文件名,然后从.处开始截取只要文件名称,不要文件后缀例如.jpg,.jpeg...
*/
String fileExtensionName = Objects.requireNonNull(file.getOriginalFilename())
.substring(file.getOriginalFilename().indexOf("."));
log.info("截取的原始文件后缀名称为:{}", fileExtensionName);
/**
* 文件在oos中存储的完整路径名称
*/
String filePath = folderName + "/" + fileName + fileExtensionName;
log.info("当前文件完整路径名称:{}", filePath);
OSS ossClient = null;
try {
/**
* 根据阿里云的端点,用户key,密码生成OSS对象
*/
ossClient = new OSSClientBuilder()
.build(aliyunProperties.getEndpoint(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
/**
* 上传文件到OSS,并相应结果
*/
PutObjectResult putObject = ossClient.putObject(aliyunProperties.getBucketName(),
filePath, file.getInputStream());
ResponseMessage response = putObject.getResponse();
if (response == null) {
log.info("getBucketDomain:{}", aliyunProperties.getBucketDomain());
return CommonResult.success("上传成功!", aliyunProperties.getBucketDomain() + filePath);
} else {
/**
* 上传失败,相应错误码和错误信息
*/
String errorMsg = "响应的错误码是:[" + response.getStatusCode() + "]错误信息是:[" + response.getErrorResponseAsString() + "]";
return CommonResult.fail(errorMsg);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return CommonResult.fail("文件操作失败!");
}
/**
* 文件删除
*
* @param fileUrl
* @param aliyunProperties
* @return
*/
public static CommonResult<?> deleteFileName(String fileUrl, AliyunProperties aliyunProperties) {
if (StringUtils.isEmpty(fileUrl)) {
return CommonResult.fail("文件路径不能为空!");
}
/**
* 去除文件url中的Bucket域名,获取原始文件名称
*/
String filePath = fileUrl.replace(aliyunProperties.getBucketDomain(), "");
log.info("去除文件中的Bucket域名后为:{}", filePath);
OSS ossClient = null;
try {
ossClient = new OSSClientBuilder()
.build(aliyunProperties.getEndpoint(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
log.info("aliyunProperties.getBucketName():{}", aliyunProperties.getBucketName());
ossClient.deleteObject(aliyunProperties.getBucketName(), filePath);
return CommonResult.success("删除文件成功!");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return CommonResult.fail("删除文件失败!");
}
}
2.5:定义注解导入配置
package com.qycq.api.annotations;
import com.qycq.common.pojo.OssProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;
import java.lang.annotation.*;
/**
* As we all know, where there is Wolong,there must be phoenix!
*<p>
* 开启oss文件服务
*</p>
* @author 七月初七
* @version 1.0
* @date 2021/11/15 1:24
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Configuration
@Import(OssProperties.class)
public @interface EnableOssProperties {
boolean flag() default true;
}
测试代码:
package com.qycq.article.controller;
import com.qycq.common.enums.OssEnum;
import com.qycq.common.pojo.OssProperties;
import com.qycq.common.utils.AliyunOssUtil;
import com.qycq.common.utils.CommonResult;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
* As we all know, where there is Wolong,there must be phoenix!
*
* @author 七月初七
* @version 1.0
* @date 2021/11/15 1:28
*/
@RestController
@ApiModel(value = "测试OSS")
@Slf4j
@RequestMapping("/test")
public class TestController {
@Autowired
private OssProperties ossProperties;
@PostMapping("/upload")
@ApiOperation(value = "文件上传")
public CommonResult<?> upload(@RequestParam("file") MultipartFile file) {
return AliyunOssUtil.uploadFileToOss(OssEnum.USER, file, ossProperties.getAliyun());
}
@DeleteMapping("/delete")
@ApiOperation(value = "删除文件")
public CommonResult<?> delete(@RequestParam("fileUrl") String fileUrl) {
return AliyunOssUtil.deleteFileName(fileUrl, ossProperties.getAliyun());
}
}
2.6:具体测试
- 上传成功
- 我们拿到这个url去访问远程服务器
- 我们去查看阿里oss服务器
删除的话就是将这窜url传递进去,这里就不再演示啦!!!,感谢大家观看嘤嘤嘤~~