1.对象存储oss的概念
OSS类似于网盘,但是你可以拿到文件支链,包含附件服务器、头像服务器、图片服务器、下载服务器等,对象存储OSS是在云上提供无层次结构的分布式存储产品,为用户提供单价较低且快速可靠的数据存储方案。用户可通过云服务器实例或互联网使用 Web API 接口存储和检索数据。在 OSS 上的数据,用户使用指定域名的 URL 地址,通过 HTTP/HTTPS 协议存储和检索每个独立的数据对象。
2.对象存储的优点
可扩展性高:对外服务是可以宣称做到空间无限的,用户不用担心空间不够的问题;
安全性高:对象存储通常凭借HTTP调用对象存储本身提供的认证密钥来提供数据访问;
效率高:扁平化结构,不受复杂目录系统对性能的影响;
成本低:与块存储方式相比,对象存储是最具成本效益的数据存储类型,并且与云计算搭配,把对象存储的这一特性发挥的淋漓尽致。
访问方便:对象存储提供开放的REST API接口。程序员在开发应用时,直接把存储参数写进代码,就可以通过API接口调用对象存储里的数据。相比文件存储那一串串的路径,对象存储要方便很多。(对象存储需求用户,并不是个人买来当网盘用,而是企业或政府用户用于系统数据存储。例如企业系统的归档数据,网站、App的静态图片、音频、视频等。)
3.阿里云oss对象存储
为了解决海量数据存储与弹性扩容,我们采用云存储的解决方案- 阿里云OSS。
3.1开通服务
进入阿里云官网网站:https://www.aliyun.com/?utm_content=se_1008364713 搜索产品对象存储OSS
具体步骤可参考如下:
(1)申请阿里云账号
(2)实名认证
(3)开通“对象存储OSS”服务
(4)进入管理控制台
3.2创建bucket
选择:标准存储、公共读、不开通
4.使用java代码上传图片到oss
4.1创建项目
创建maven项目aliyun-oss
4.2导入依赖
在pom.xml中导入相关依赖
com.aliyun.ossaliyun-sdk-oss2.5.0
4.3定义常量
在application.yml中定义常量
aliyun: oss: file: endpoint: oss-cn-shanghai.aliyuncs.com keyid: LTAIsOB7XkCHTGX8 keysecret: ASy5lzMwr5KIVEUY3eDhFFijD1RkPC bucketname: eric123
4.4创建初始化工具类
创建一个类来获取yml里面定义的常量
具体代码操作如下
@Value("${aliyun.oss.file.endpoint}") private String endpoint; @Value("${aliyun.oss.file.keyid}") private String keyid; @Value("${aliyun.oss.file.keysecret}") private String keysecret; @Value("${aliyun.oss.file.bucketname}") private String bucketname; @Value("${aliyun.oss.file.host}") private String host; //定义常量,为了能够使用 public static String ENDPOINT; public static String KEYID; public static String KEYSECRET; public static String BUCKEYNAME; public static String HOST; @Override public void afterPropertiesSet() throws Exception { ENDPOINT=endpoint; KEYID=keyid; KEYSECRET=keysecret; BUCKEYNAME=bucketname; HOST=host; }
View Code
4.5上传文件到oss
创建类来实现上传文件到阿里云oss,参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流
@PostMapping("uploadFile") public R uploadTeacherImg(@RequestParam("file") MultipartFile file, @RequestParam(value = "host", required = false) String host) { try { String filename = file.getOriginalFilename(); String uuid = UUID.randomUUID().toString(); filename = uuid + filename; //获取当前时间 String filepath = new DateTime().toString("yyyy/MM/dd"); //拼接文件完整名称 String hostName = ConstantPropertiesUtil.HOST; if (StringUtils.isEmpty(host)) { filename = filepath + "/"+ hostName + "/" + filename ; } else { filename = filepath + "/" + host + "/" + filename; } InputStream in = file.getInputStream(); // 创建OSSClient实例。 OSSClient ossClient = new OSSClient(ConstantPropertiesUtil.ENDPOINT, ConstantPropertiesUtil.KEYID, ConstantPropertiesUtil.KEYSECRET); // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。 // InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt"); // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。 ossClient.putObject(ConstantPropertiesUtil.BUCKEYNAME, filename, in); // 关闭OSSClient。 ossClient.shutdown(); //https://eric123.oss-cn-shanghai.aliyuncs.com/0406_1.jpg String path = "http://" + ConstantPropertiesUtil.BUCKEYNAME + "." + ConstantPropertiesUtil.ENDPOINT + "/" + filename; return R.ok().data("imageUrl", path); } catch (Exception e) { return R.error(); } }
4.6删除oss中的文件
// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = ""; String accessKeySecret = ""; String bucketName = ""; String objectName = "";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。ossClient.deleteObject(bucketName, objectName);// 关闭OSSClient。ossClient.shutdown();