一、什么是对象存储OSS
1、阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。
2、其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%
3、OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
二、对象存储OSS作用
1、阿里云对象存储OSS简单的说就是我们花钱在阿里购买存储空间
2、然后我们可以将项目中的图片文件等资源存储在对象存储OSS服务器上
3、对象存储OSS提供对文件的上传,下载, 删除等管理操作
4、这样我们就省去了购买存储服务器, 搭建存储服务器, 运营管理存储服务器的繁琐操作.
5、本方案适用于中小型规模公司, 对于并发量, 存储的数据量不大的情况下使用, 因为如果高并发大数据量阿里虽然也支持, 但是每年付出的费用相当昂贵, 这个时候可以选用FastDFS自己去购买服务器搭建并运营管理. 则更省钱.500mb hadoop
三、对象存储OSS概念
存储类型(Storage Class): OSS提供标准、低频访问、归档、冷归档四种存储类型, 针对不同数据使用频率.
存储空间(Bucket): 存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。
对象(Object): 对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。
地域(Region): 地域表示OSS的数据中心所在物理位置
访问域名(Endpoint): Endpoint表示OSS对外服务的访问域名
访问密钥(AccessKey): EndpoiAccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份nt表示OSS对外服务的访问域名
四、OSS的使用
1、登录和注册

2、选择OSS

3、选择机型
4、点击购买

5、选择控制台
6、进入OOS

7.配置bucket


8、查看 key和id


五、java操作OSS
1、查看API文档

2、api文档


3、创建springboot项目
导入依赖
JDK8 以下版本<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version></dependency>JDK9以上版本<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><!-- no more than 2.3.3--><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version></dependency>
4、编写OSS工具类
定义开发key
// endpointprivate String endpoint = "https://oss-cn-beijing.aliyuncs.com";// accessKeyprivate String accessKeyId = "LTAI5tMBzRMrGk1p3cinHY9w";private String accessKeySecret = "GkAphDCxzqsENzitdDDM5B3di3Q2Qx";// 空间private String bucketName = "zhougz1985";// 文件存储目录private String filedir = "";
编写构造方法
public OSSClientUtil() {ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);}
销毁方法
/*** 销毁*/public void destory() {ossClient.shutdown();}
文件上传方法
/*** 上传图片** @param url*/public void uploadImg2Oss(String url) throws Exception {File fileOnServer = new File(url);FileInputStream fin;try {fin = new FileInputStream(fileOnServer);String[] split = url.split("/");this.uploadFile2OSS(fin, split[split.length - 1]);} catch (FileNotFoundException e) {throw new FileUploadException("图片上传失败");}}public String uploadImg2Oss(MultipartFile file) throws Exception {if (file.getSize() > 10 * 1024 * 1024) {throw new FileUploadException("上传图片大小不能超过10M!");}String originalFilename = file.getOriginalFilename();String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();Random random = new Random();String name = random.nextInt(10000) + System.currentTimeMillis() + substring;try {InputStream inputStream = file.getInputStream();this.uploadFile2OSS(inputStream, name);return name;} catch (Exception e) {throw new FileUploadException("图片上传失败");}}
文件上传路径
/*** 获得图片路径** @param fileUrl* @return*/public String getImgUrl(String fileUrl) {System.out.println("fileuel"+fileUrl);if (!StringUtils.isEmpty(fileUrl)) {String[] split = fileUrl.split("/");return this.getUrl(this.filedir + split[split.length - 1]);}return null;}/*** 获得url链接** @param key* @return*/public String getUrl(String key) {System.out.println("key"+key);// 设置URL过期时间为10年 3600l* 1000*24*365*10Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);// 生成URLURL url = ossClient.generatePresignedUrl(bucketName, key, expiration);if (url != null) {return url.toString();}return null;}
文件上传OSS
/*** 上传到OSS服务器 如果同名文件会覆盖服务器上的** @param instream* 文件流* @param fileName* 文件名称 包括后缀名* @return 出错返回"" ,唯一MD5数字签名*/public String uploadFile2OSS(InputStream instream, String fileName) {String ret = "";try {// 创建上传Object的MetadataObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentLength(instream.available());objectMetadata.setCacheControl("no-cache");objectMetadata.setHeader("Pragma", "no-cache");objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));objectMetadata.setContentDisposition("inline;filename=" + fileName);// 上传文件PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);ret = putResult.getETag();} catch (IOException e) {logger.error(e.getMessage(), e);} finally {try {if (instream != null) {instream.close();}} catch (IOException e) {e.printStackTrace();}}return ret;}
文件类型
/*** Description: 判断OSS服务文件上传时文件的contentType** 文件后缀* @return String*/public static String getcontentType(String filenameExtension) {if (filenameExtension.equalsIgnoreCase("bmp")) {return "image/bmp";}if (filenameExtension.equalsIgnoreCase("gif")) {return "image/gif";}if (filenameExtension.equalsIgnoreCase("jpeg") || filenameExtension.equalsIgnoreCase("jpg")|| filenameExtension.equalsIgnoreCase("png")) {return "image/jpeg";}if (filenameExtension.equalsIgnoreCase("html")) {return "text/html";}if (filenameExtension.equalsIgnoreCase("txt")) {return "text/plain";}if (filenameExtension.equalsIgnoreCase("vsd")) {return "application/vnd.visio";}if (filenameExtension.equalsIgnoreCase("pptx") || filenameExtension.equalsIgnoreCase("ppt")) {return "application/vnd.ms-powerpoint";}if (filenameExtension.equalsIgnoreCase("docx") || filenameExtension.equalsIgnoreCase("doc")) {return "application/msword";}if (filenameExtension.equalsIgnoreCase("xml")) {return "text/xml";}return "image/jpeg";}
编写controller
@PostMapping("/fileUpload")public String fileUpload(MultipartFile file) throws Exception{OSSClientUtil ossClient=new OSSClientUtil();String name = ossClient.uploadImg2Oss(file);String imgUrl = ossClient.getImgUrl(name);return imgUrl;}
编写html
<form action="/fileUpload" method="post" enctype="multipart/form-data"><input type="file" name="file"/><input type="submit" value="上传"/></form>
