文章目录
简介
阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。非常适合存储非结构化数据,例如视频、图形、日志、文本文件以及各种App应用、多终端同步软件、网盘下载站的文件等,单个文件的大小从1字节到48.8TB,可以存储的个数无限制。
endpoint:阿里云服务部署的地区位置
见解
阿里云就像是一个远程数据库管理系统可以类比mysql数据库管理系统理解
阿里云管理的是远程数据库(阿里部署的存储站点),mysql管理的是本地数据库(内存)
- 先是使用OSS依赖(jdbc.jar包)进行驱动。
- 然后通过Endpoint(数据库管理系统的访问端口地址),OSS(远程数据库管理系统)的访问域名:唯一
- 通过AccessKey ID(username),密匙(password)
- 连接访问对应bucket(数据库)
- 最后调用阿里云API接口上传文件,若文件上传成功,oss则会构建一个可以访问此次上传文件的url:(“https://”+bucketName+“.”+endpoint+“/”+fileName)
- 代码端也可以通过阿里云的API接口获得上传成功文件的基本信息。
开发步骤
依然是MVC结构
网课链接
配置文件
#服务端口
server.port=8002
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=qlugcl-edu
aliyun.oss.file.keyid=LTAI5tPQCVTeX3kTRUPoEREb
aliyun.oss.file.keysecret=7CekMsaTozFQKQl5UXUJAbhPYUATUF
utils层(读取全局配置文件并赋值给类变量)
package com.qlugcl.oss.utils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//当项目已启动,spring接口,spring加载之后,执行接口一个方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//读取全局配置文件内容进行赋值
@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;
//定义公开静态常量从而通过静态变量使用private变量,(为什么不直接用getset方法和spring声明周期有关)
//OssServiceImpl中会用到。
public static String END_POIND;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POIND = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
service层
package com.qlugcl.oss.service;
import org.springframework.web.multipart.MultipartFile;
public interface OssService {
//上传头像到oss
String uploadFileAvatar(MultipartFile file);
}
impl(基于oss驱动sdk实现类)
package com.qlugcl.oss.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.qlugcl.oss.service.OssService;
import com.qlugcl.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class OssServiceImpl implements OssService {
//上传头像到oss
@Override
public String uploadFileAvatar(MultipartFile file) {
// 工具类获取值
String endpoint = ConstantPropertiesUtils.END_POIND;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
try {
// 创建OSS实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//获取上传文件输入流
InputStream inputStream = file.getInputStream();
//获取文件名称
String fileName = file.getOriginalFilename();
//1 在文件名称里面添加随机唯一的值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
// yuy76t5rew01.jpg
fileName = uuid+fileName;
//2 把文件按照日期进行分类
//获取当前日期,建立日期文件夹:年/月/日/文件名
// 2019/11/12/
String datePath = new DateTime().toString("yyyy/MM/dd");
//拼接
// 使用id和日期戳保证文件名的唯一性:年/月/日/uuid+filename
fileName = datePath+"/"+fileName;
//调用oss方法实现上传
//第一个参数 Bucket名称:qlugcl-edu
//第二个参数 上传到oss文件路径和文件名称 aa/bb/1.jpg
//第三个参数 上传文件输入流
ossClient.putObject(bucketName,fileName , inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后文件路径返回
//需要把上传到阿里云oss路径手动拼接出来
//https://qlugcl-edu.oss-cn-beijing.aliyuncs.com/01.jpg
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
return url;
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
controller层(MultipartFile接收前端file文件数据)
package com.qlugcl.oss.controller;
import com.qlugcl.commonutils.R;
import com.qlugcl.oss.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin
public class OssController {
@Autowired
private OssService ossService;
//上传头像的方法
@PostMapping
public R uploadOssFile(MultipartFile file) {
//获取上传文件 MultipartFile
//返回上传到oss的路径
String url = ossService.uploadFileAvatar(file);
return R.ok().data("url",url);
}
}