OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据,非常方便。
使用前需要先注册开通阿里云存储服务。
官方网站:https://oss.console.aliyun.com/
阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%。
OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)作为不经常访问数据的存储方式。
存储类型(Storage Class)
OSS提供标准、低频访问、归档三种存储类型,全面覆盖从热到冷的各种数据存储场景。其中标准存储类型提供高可靠、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据,在三种存储类型中单价最低。详情请参见官网存储类型介绍。
存储空间(Bucket)
存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。您可以根据实际需求,创建不同类型的存储空间来存储不同的数据。创建存储空间请参见官网创建存储空间。
对象(Object)
对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,例如最后修改时间、大小等信息,同时您也可以在元信息中存储一些自定义的信息。
地域(Region)
地域表示OSS的数据中心所在物理位置。您可以根据费用、请求来源等选择合适的地域创建Bucket。详情请参见 官网OSS 已开通的Region。
访问域名(Endpoint)
Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。具体的内容请参见官网各个Region对应的Endpoint。
访问密钥(AccessKey)
AccessKey简称AK,指的是访问身份验证中用到的AccessKey Id和AccessKey Secret。OSS通过使用AccessKey Id和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey Id用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。获取AccessKey的方法请参见官网创建AccessKey。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--aliyunOSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
# 按照注册的阿里云存储控制台中提供的信息进行如下配置
oss.file.endpoint=
oss.file.keyid=
oss.file.keysecret=
oss.file.bucketname=
oss.file.filehost=
AliossConfig.java
@Configuration
public class AliossConfig implements InitializingBean {
@Value("${oss.file.endpoint}")
private String java4all_file_endpoint;
@Value("${oss.file.keyid}")
private String java4all_file_keyid;
@Value("${oss.file.keysecret}")
private String java4all_file_keysecret;
@Value("${oss.file.filehost}")
private String java4all_file_filehost;
@Value("${oss.file.bucketname}")
private String java4all_file_bucketname1;
public static String JAVA4ALL_END_POINT ;
public static String JAVA4ALL_ACCESS_KEY_ID ;
public static String JAVA4ALL_ACCESS_KEY_SECRET ;
public static String JAVA4ALL_BUCKET_NAME1 ;
public static String JAVA4ALL_FILE_HOST ;
@Override
public void afterPropertiesSet() throws Exception {
JAVA4ALL_END_POINT = java4all_file_endpoint;
JAVA4ALL_ACCESS_KEY_ID = java4all_file_keyid;
JAVA4ALL_ACCESS_KEY_SECRET = java4all_file_keysecret;
JAVA4ALL_FILE_HOST = java4all_file_filehost;
JAVA4ALL_BUCKET_NAME1 = java4all_file_bucketname1;
}
}
AliyunOSSUtil.java
提供了简单的文件上传,文件删除和文件查询
public class AliyunOSSUtil {
public static String endpoint= AliossConfig.JAVA4ALL_END_POINT;
public static String accessKeyId=AliossConfig.JAVA4ALL_ACCESS_KEY_ID;
public static String accessKeySecret=AliossConfig.JAVA4ALL_ACCESS_KEY_SECRET;
public static String bucketName=AliossConfig.JAVA4ALL_BUCKET_NAME1;
public static String fileHost=AliossConfig.JAVA4ALL_FILE_HOST;
public static String upload(File file){
System.out.println("=========>OSS文件上传开始:"+file.getName());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(new Date());
if(null == file){
return null;
}
OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
try {
//容器不存在,就创建
if(! ossClient.doesBucketExist(bucketName)){
ossClient.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
//创建文件路径
String fileUrl = fileHost+"/"+(dateStr + "/" + UUID.randomUUID().toString().replace("-","")+"-"+file.getName());
//上传文件
PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
//设置权限 这里是公开读
ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
if(null != result){
System.out.println("==========>OSS文件上传成功,OSS地址:"+fileUrl);
return fileUrl;
}
}catch (OSSException oe){
System.err.println(oe.getMessage());
}catch (ClientException ce){
System.err.println(ce.getMessage());
}finally {
//关闭
ossClient.shutdown();
}
return null;
}
/**
* 删除Object
* @param fileKey
* @return
*/
public static String deleteFile(String fileKey){
System.out.println("=========>OSS文件删除开始");
try {
OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
if(!ossClient.doesBucketExist(bucketName)){
System.out.println("==============>您的Bucket不存在");
return "您的Bucket不存在";
}else {
System.out.println("==============>开始删除Object");
ossClient.deleteObject(bucketName,fileKey);
System.out.println("==============>Object删除成功:"+fileKey);
return "==============>Object删除成功:"+fileKey;
}
}catch (Exception ex){
System.err.println("删除Object失败" + ex);
return "删除Object失败";
}
}
/**
* 查询文件名列表
* @param bucketName
* @return
*/
public static List<String> getObjectList(String bucketName){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
List<String> listRe = new ArrayList<>();
try {
System.out.println("===========>查询文件名列表");
OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
//列出test目录下今天所有文件
listObjectsRequest.setPrefix("test/"+format.format(new Date())+"/");
ObjectListing list = ossClient.listObjects(listObjectsRequest);
for(OSSObjectSummary objectSummary : list.getObjectSummaries()){
listRe.add(objectSummary.getKey());
}
return listRe;
}catch (Exception ex){
System.out.println("==========>查询列表失败,失败原因:"+ ex);
return new ArrayList<>();
}
}
}
UploadController.java
@Controller
@RequestMapping("upload")
public class UploadController {
@RequestMapping(value = "uploadFile",method = RequestMethod.POST)
public String toUploadFile(MultipartFile file){
System.out.println("============>文件上传");
try {
if(null != file){
String filename = file.getOriginalFilename();
if(!"".equals(filename.trim())){
File newFile = new File(filename);
FileOutputStream os = new FileOutputStream(newFile);
os.write(file.getBytes());
os.close();
file.transferTo(newFile);
//上传到OSS
String uploadUrl = AliyunOSSUtil.upload(newFile);
}
}
}catch (Exception ex){
ex.printStackTrace();
}
return "index";
}
@RequestMapping(value = "toUploadFile",method = RequestMethod.GET)
public String toUploadFile(){
return "upload";
}
}
DeleteController.java
@RestController
@RequestMapping("/delete")
public class DeleteController {
@RequestMapping(value = "deleteFile",method = RequestMethod.GET)
@ResponseBody
public String deleteFile(){
//删除为了简单验证,写死固定值
String ObjectKey = "test/2020-06-28/5247d2169fb240929f511c7613010101-2015-07-21-222033.png";
AliyunOSSUtil.deleteFile(ObjectKey);
return "删除成功";
}
}
QueryController.java
@RestController
@RequestMapping("/query")
public class QueryController {
@ResponseBody
@RequestMapping(value = "getObjectList",method = RequestMethod.GET)
public List<String> getObjectList(){
String bucketName = AliossConfig.JAVA4ALL_BUCKET_NAME1;
List<String> objectList = AliyunOSSUtil.getObjectList(bucketName);
return objectList;
}
}
由于文件上传需要有文件支持,所以简单开发一个上传页面,来满足上传功能:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>文件上传</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="/upload/uploadFile">
<p>文件:<input type="file" name="file"/></p>
<p><input type="submit" value="上传" /></p>
</form>
</body>
</html>
启动程序,浏览器中输入localhost:8080,出现上传页面,点击上传,查看控制台信息:
2020-06-28 23:42:04.663 INFO 11816 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms
============>文件上传
=========>OSS文件上传开始:2015-07-21-222033.png
==========>OSS文件上传成功,OSS地址:test/2020-06-28/5247d2169fb240929f511c7613010101-2015-07-21-222033.png
登录阿里云存储管理控制台查看验证:
再一次验证查询和删除:
查询:
删除:
控制台打印内容如下:
=========>OSS文件删除开始
==============>开始删除Object
==============>Object删除成功:test/2020-06-28/5247d2169fb240929f511c7613010101-2015-07-21-222033.png