文章目录
一、基本使用
① 引入依赖
<!--springboot的web开发依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--阿里云oss依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.0</version>
</dependency>
<!--日期时间工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
② application.yml 添加访问oss需要的参数
#操作oss需要的一些参数
aliyun:
accessKeyId: 你的accessKeyId # 阿里云的accessKeyId
secretAccessKey: 你的accessKey密码 # accessKey 密码
oss:
endPoint: 你的endpoint # Endpoint:在阿里云oss控制台查看自己使用的endpoint
bucketName: 你的bucketName # bucket 名称
③ 编写oss工具类
编写工具类以便复用,减少代码量和提高可阅读性。
这里就示例了两种上传方法,需要其他方法自己添加。
@Component
public class OssUtils {
@Value("${aliyun.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.secretAccessKey}")
private String secretAccessKey;
@Value("${aliyun.oss.endPoint}")
private String endPoint;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
public String uploadOneFile(MultipartFile file) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
//设置文件名
String fileName = new DateTime().toString("yyyy/MM/dd")
+ UUID.randomUUID().toString().replace("-", "")
+ file.getOriginalFilename();
try {
// 创建PutObject请求。
ossClient.putObject(bucketName, fileName, file.getInputStream());
String url = "http://" + bucketName + "." + endPoint + "/" + fileName;
return url;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
public List<String> uploadArrayFile(MultipartFile[] files) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
List<String> list = new ArrayList<>();
try {
//设置文件名
for (MultipartFile file : files) {
String fileName = new DateTime().toString("yyyy/MM/dd")
+ UUID.randomUUID().toString().replace("-", "")
+ file.getOriginalFilename();
// 创建PutObject请求。
ossClient.putObject(bucketName, fileName, file.getInputStream());
String url = "http://" + bucketName + "." + endPoint + "/" + fileName;
list.add(url);
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return list;
}
public boolean deleteFile(String fileUrl) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
/** oss删除文件是根据文件完成路径删除的,但文件完整路径中不能包含Bucket名称。
* 比如文件路径为:http://edu-czf.oss-cn-guangzhou.aliyuncs.com/2022/08/abc.jpg",
* 则完整路径就是:2022/08/abc.jpg
*/
int begin = ("http://" + bucketName + "." + endPoint + "/").length(); //找到文件路径的开始下标
String deleteUrl = fileUrl.substring(begin);
try {
// 删除文件请求
ossClient.deleteObject(bucketName, deleteUrl);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
④ 编写controller
@RestController
@RequestMapping("/oss")
@CrossOrigin
public class OssController {
@Autowired
OssUtils ossUtils;
@PostMapping("uploadOneFile")
public String uploadFile(MultipartFile file) {
//返回上传oss的url
return ossUtils.uploadOneFile(file);
}
@PostMapping("uploadArrayFile")
public List<String> uploadArrayFile(MultipartFile[] files) {
//返回上传oss的url
return ossUtils.uploadArrayFile(files);
}
@PostMapping("deleteFile")
public boolean deleteFile(@RequestBody String fileUrl) {
//返回是否删除成功
return ossUtils.deleteFile(fileUrl);
}
}
⑤ 访问文件?
文件③不是生成了文件的url吗?把这个url存入数据库,下次要访问这个文件直接在数据库查这个文件url返回即可。
安全使用
①防止资源盗用——防盗链
防盗链功能通过设置Referer白名单以及是否允许空Referer,限制仅白名单中的域名可以访问您Bucket内的资源。OSS支持基于HTTP和HTTPS header中表头字段Referer的方法设置防盗链。
是否进行防盗链验证的具体场景如下:
仅当通过签名URL或者匿名访问Object时,进行防盗链验证。
当请求的Header中包含Authorization字段,不进行防盗链验证(类似token验证)。’
具体查看官方javaSDK:
https://help.aliyun.com/document_detail/31869.html?spm=a2c6h.13066369.question.30.194267042eSJxJ
② 防盗刷流量
oss添加东西不用钱,访问花费的流量要收费,为了防止恶意访问刷流量,损失大量的钱,使用的时候一定要加一些安全措施!
防盗链+oss内网访问+流量控制
- 防盗链:上面所讲的添加防盗链能起有效作用,能防止爬虫、浏览器直接访问、重复发请求工具等方式盗刷流量。但是!避免不了伪造Referer!所以还是能盗刷的,只不过能防止一些简单盗刷。
- oss内网访问:
使用oss的用户一般使用的服务器也是阿里云的,阿里云的服务之间可以内网访问,oss内网访问不会进行流量计费,但是服务器也得是阿里云的,且服务器选择的是固定宽带!所以可以使用内网的Endpoint和Bucket。
用springboot当中间媒介,从oss中获取资源流,然后将资源流返回。
application.yml中配置内网的endPoint和bucketName
#操作oss需要的一些参数
aliyun:
accessKeyId: 你的accessKeyId # 阿里云的accessKeyId
secretAccessKey: 你的accessKey密码 # accessKey 密码
oss:
endPoint: 自己的endpoint # Endpoint:在阿里云oss控制台查看自己使用的endpoint
bucketName: 自己的bucketName # bucket 名称
- 流量控制:有很多手段,比如springcloud的Sentinel做流量控制。
③ 阿里云CDN配合OSS
如果允许一定的流量计费,做好流量监控,峰值限制之类的保护措施,用CDN配合oss更好,比直接用oss便宜高效多了,也比用springboot作中间媒介速度快很多。
CDN+OSS的具体使用方式自行搜索,阿里云官网和其他博客有很多教程