OSS云储存实战
快速入门
- 案例描述
图片上传 配置环境
pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.oss</groupId> <artifactId>oss-project01</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.8.0</version> </dependency> </dependencies> </project>图片上传代码实现
package com.oss; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class FileUpLoad { public static void main(String[] args) throws FileNotFoundException { // Endpoint以杭州为例,其它Region请按实际情况填写。 //String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; String endpoint = "http://oss-cn-beijing.aliyuncs.com"; // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践 创建并使用RAM子账号进行API访问或日常运维, String accessKeyId = "LTAI4GD1XcQgrQuvkKnZYhhA"; String accessKeySecret = "1n2i3VNxd5gWr9YPYuJbVMophsXUQr"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件流。 InputStream inputStream = new FileInputStream(new File("src\\main\\resources\\1.png")); ossClient.putObject("test-imgs", "1.png", inputStream); // 关闭OSSClient。 ossClient.shutdown(); } }java API操作
- 需求描述
1)创建Bucket
2)把字符串存入OSS,Object的名称为firstKey
3)下载文件
4)文件存储入OSS
5)查看Bucket中的Object
6)删除Object 功能实现
pom.xml 同上一个例子
代码实现package com.oss; import java.io.*; import java.util.List; import java.util.Properties; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.BucketInfo; import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.OSSObjectSummary; import com.aliyun.oss.model.ObjectListing; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class HelloOSS { static Logger logger = Logger.getLogger(HelloOSS.class); // endpoint是访问OSS的域名。如果您已经在OSS的控制台上 创建了Bucket,请在控制台上查看域名。 // 如果您还没有创建Bucket,endpoint选择请参看文档中心的“开发人员指南 > 基本概念 > 访问域名”, // 链接地址是:https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html?spm=5176.docoss/user_guide/endpoint_region // endpoint的格式形如“http://oss-cn-hangzhou.aliyuncs.com/”,注意http://后不带bucket名称, // 比如“http://bucket-name.oss-cn-hangzhou.aliyuncs.com”,是错误的endpoint,请去掉其中的“bucket-name”。 private static String endpoint = "http://oss-cn-beijing.aliyuncs.com"; // accessKeyId和accessKeySecret是OSS的访问密钥,您可以在控制台上创建和查看, // 创建和查看访问密钥的链接地址是:https://ak-console.aliyun.com/#/。 // 注意:accessKeyId和accessKeySecret前后都没有空格,从控制台复制时请检查并去除多余的空格。 private static String accessKeyId = "LTAI4GD1XcQgrQuvkKnZYhhA"; private static String accessKeySecret = "1n2i3VNxd5gWr9YPYuJbVMophsXUQr"; // Bucket用来管理所存储Object的存储空间,详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。 // Bucket命名规范如下:只能包括小写字母,数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。 private static String bucketName = "test-imgs"; // Object是OSS存储数据的基本单元,称为OSS的对象,也被称为OSS的文件。详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。 // Object命名规范如下:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。 private static String firstKey = "my-first-key"; public static void main(String[] args) throws IOException { // 日志配置,OSS Java SDK使用log4j记录错误信息。示例程序会在工程目录下生成“ossdemo.log”日志文件,默认日志级别是INFO。 // 日志的配置文件是“conf/log4j.properties”,如果您不需要日志,可以没有日志配置文件和下面的日志配置。 // PropertyConfigurator.configure("conf/log4j.properties"); InputStream in = HelloOSS.class.getClassLoader().getResourceAsStream("log4j.properties"); Properties properties = new Properties(); properties.load(in); PropertyConfigurator.configure(properties); logger.info("Started"); // 生成OSSClient,您可以指定一些参数,详见“SDK手册 > Java-SDK > 初始化”, // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/init.html?spm=5176.docoss/sdk/java-sdk/get-start OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); try { // 判断Bucket是否存在。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/ manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init if (ossClient.doesBucketExist(bucketName)) { System.out.println("您已经创建Bucket:" + bucketName + "。"); } else { System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。"); // 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init ossClient.createBucket(bucketName); } // 查看Bucket信息。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init BucketInfo info = ossClient.getBucketInfo(bucketName); System.out.println("Bucket " + bucketName + "的信息如下:"); System.out.println("\t数据中心:" + info.getBucket().getLocation()); System.out.println("\t创建时间:" + info.getBucket().getCreationDate()); System.out.println("\t用户标志:" + info.getBucket().getOwner()); // 把字符串存入OSS,Object的名称为firstKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/upload_object.html?spm=5176.docoss/user_guide/upload_object InputStream is = new ByteArrayInputStream("Hello OSS".getBytes()); ossClient.putObject(bucketName, firstKey, is); System.out.println("Object:" + firstKey + "存入OSS成功。"); // 下载文件。详细请参看“SDK手册 > Java-SDK > 下载文件”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/download_object.html?spm=5176.docoss/sdk/java-sdk/manage_object OSSObject ossObject = ossClient.getObject(bucketName, firstKey); InputStream inputStream = ossObject.getObjectContent(); StringBuilder objectContent = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); while (true) { String line = reader.readLine(); if (line == null) break; objectContent.append(line); } inputStream.close(); System.out.println("Object:" + firstKey + "的内容是:" + objectContent); // 文件存储入OSS,Object的名称为fileKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/upload_object.html?spm=5176.docoss/user_guide/upload_object String fileKey = "README.md"; ossClient.putObject(bucketName, fileKey, new File("src\\main\\resources\\README.md")); System.out.println("Object:" + fileKey + "存入OSS成功。"); // 查看Bucket中的Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket ObjectListing objectListing = ossClient.listObjects(bucketName); List<OSSObjectSummary> objectSummary = objectListing.getObjectSummaries(); System.out.println("您有以下Object:"); for (OSSObjectSummary object : objectSummary) { System.out.println("\t" + object.getKey()); } // 删除Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。 // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/javasdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket ossClient.deleteObject(bucketName, firstKey); System.out.println("删除Object:" + firstKey + "成功。"); ossClient.deleteObject(bucketName, fileKey); System.out.println("删除Object:" + fileKey + "成功。"); } catch (OSSException oe) { oe.printStackTrace(); } catch (ClientException ce) { ce.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { ossClient.shutdown(); } logger.info("Completed"); } }log4j.properties
log4j.rootLogger=INFO, RFA ossdemo.log.dir=. ossdemo.log.file=oss-demo.log # Logging Threshold log4j.threshold=ALL # Null Appender log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender # # Rolling File Appender - cap space usage at 5gb. # ossdemo.log.maxfilesize=256MB ossdemo.log.maxbackupindex=20 log4j.appender.RFA=org.apache.log4j.RollingFileAppender log4j.appender.RFA.File=${ossdemo.log.dir}/${ossdemo.log.file} log4j.appender.RFA.MaxFileSize=${ossdemo.log.maxfilesize} log4j.appender.RFA.MaxBackupIndex=${ossdemo.log.maxbackupindex} log4j.appender.RFA.layout=org.apache.log4j.PatternLayout # Pattern format: Date LogLevel LoggerName LogMessage log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n # Debugging Pattern format #log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n # # Daily Rolling File Appender # log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender log4j.appender.DRFA.File=${ossdemo.log.dir}/${ossdemo.log.file} # Rollver at midnight log4j.appender.DRFA.DatePattern=.yyyy-MM-dd # 30-day backup #log4j.appender.DRFA.MaxBackupIndex=30 log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout # Pattern format: Date LogLevel LoggerName LogMessage log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n # Debugging Pattern format #log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n # # console # Add "console" to rootlogger above if you want to use this # log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}:%m%n
SpringBoot整合OSS上传
- 需求描述
使用SpringBoot完成上传图片 配置文件
pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.oss</groupId> <artifactId>oss-project02</artifactId> <version>1.0-SNAPSHOT</version> <!--spring boot的支持--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> </parent> <dependencies> <!--springboot 测试支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>application.properties
# Spring boot application #server.servlet.context-path=/oss-server server.port = 8999 #logging.level.root=DEBUGaliyun.properties
aliyun.endpoint=http://oss-cn-beijing.aliyuncs.com aliyun.accessKeyId=LTAI4GD1XcQgrQuvkKnZYhhA aliyun.accessKeySecret=1n2i3VNxd5gWr9YPYuJbVMophsXUQr aliyun.bucketName=test-imgs aliyun.urlPrefix=https://test-imgs.oss-cn-beijing.aliyuncs.com/编码实现
AliyunConfigpackage com.oss.config; import com.aliyun.oss.OSSClient; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:aliyun.properties") @ConfigurationProperties(prefix = "aliyun") @Data public class AliyunConfig { private String endpoint; private String accessKeyId; private String accessKeySecret; private String bucketName; private String urlPrefix; @Bean public OSSClient oSSClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } }实体对象
package com.oss.bean; import lombok.Data; @Data public class UpLoadResult { // 文件唯一标识 private String uid; // 文件名 private String name; // 状态有:uploading done error removed private String status; // 服务端响应内容,如:'{"status": "success"}' private String response; }FileUpLoadService
package com.oss.service; import com.aliyun.oss.OSSClient; import com.oss.bean.UpLoadResult; import com.oss.config.AliyunConfig; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.IOException; @Service public class FileUpLoadService { @Autowired private AliyunConfig aliyunConfig; @Autowired private OSSClient ossClient; // 允许上传的格式 private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png"}; public UpLoadResult upload(MultipartFile uploadFile) { // 校验图片格式 boolean isLegal = false; for (String type : IMAGE_TYPE) { if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) { isLegal = true; break; } } UpLoadResult uploadResult = new UpLoadResult(); if (!isLegal) { uploadResult.setStatus("error"); return uploadResult; } String fileName = uploadFile.getOriginalFilename(); String filePath = getFilePath(fileName); try { ossClient.putObject(aliyunConfig.getBucketName(),filePath, new ByteArrayInputStream(uploadFile.getBytes())); } catch (IOException e) { e.printStackTrace(); //上传失败 uploadResult.setStatus("error"); return uploadResult; } uploadResult.setStatus("done"); uploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath); uploadResult.setUid(String.valueOf(System.currentTimeMillis())); return uploadResult; } private String getFilePath(String sourceFileName) { DateTime dateTime = new DateTime(); return "images/" + dateTime.toString("yyyy") + "/" + dateTime.toString("MM") + "/" + dateTime.toString("dd") + "/" + UUID.randomUUID().toString() + "." + StringUtils.substringAfterLast(sourceFileName, "."); } }UpLoadController 控制器
package com.oss.controller; import com.oss.bean.UpLoadResult; import com.oss.service.FileUpLoadService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; @RequestMapping("/pic") @Controller public class UpLoadController { @Autowired private FileUpLoadService fileUpLoadService; @PostMapping("/upload") @ResponseBody public UpLoadResult upload(@RequestParam("file") MultipartFile multipartFile) { return this.fileUpLoadService.upload(multipartFile); } }ApplicationBoot 启动引导
package com.oss; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ApplicationBoot { public static void main(String[] args) { SpringApplication.run(ApplicationBoot.class, args); } }测试


数据处理
介绍
阿里云OSS为在云上的数据打通了一个处理与使用的快速通道。通过简单的 RESTful 接口,可以在任何时间、任何地点、任何互联网设备上对存储在OSS中的数据进行分析处理。
数据处理包含以下两种:- 阿里云OSS原生处理服务
阿里云OSS原生处理服务包括图片处理和视频截帧,其中图片处理包括图片的缩略、剪裁、参数调节等。 OSS原生处理服务无需开通,默认集成在OSS中,创建完Bucket后即可使用。产生的数据处理费用直接在OSS上结算。 智能媒体管理服务
阿里云OSS与智能媒体管理(IMM)深度结合,支持文档预览、文档格式转换、人脸识别、图片分析、二维码识别等丰富的数据分析处理操作。图片处理
本文档介绍如何快速使用OSS图片处理服务。您可以通过三种方式处理图片:为图片URL添加参数进行单次处理、使用图片样式对不同图片进行相同处理,或使用OSS SDK对图片进行处理。
| 处理操作 | 说明 | 文档 |
|---|---|---|
| 图片缩放 | 对图片进行等比缩放或固定宽高缩放。 | 图片缩放 |
| 图片裁剪 | 使用内切圆裁剪图片。 | 内切圆 |
| 通过指定范围的方式裁剪图片。 | 自定义裁剪 | |
| 将图片在x或y轴上等分为多个区域,然后取出指定区域。 | 索引切割 | |
| 使用圆角矩形裁剪图片。 | 圆角矩形 | |
| 图片旋转 | 设置是否对图片进行自动旋转 | 自适应方向 |
| 对图片进行指定角度的顺时针旋转。 | 旋转 | |
| 图片效果 | 为图片添加模糊效果。 | 模糊效果 |
| 调整图片的亮度。 | 亮度 | |
| 对图片进行锐化。 | 锐化 | |
| 调整图片的对比度。 | 对比度 | |
| 格式转换 | 将图片转换为指定的格式。 | 格式转换 |
| 可以对保存为JPG或WebP格式的图片进行图片质量转换。 | 质量变换 | |
| 指定图片的呈现方式。 | 渐进显示 | |
| 获取图片信息 | 获取图片的平均色调。 | 获取图片主色调 |
| 获取图片的宽度、长度、文件大小、格式、EXIF信息等。 | 获取信息 | |
| 图片水印 | 为图片添加图片、文字或混合水印。 | 图片水印 |
视频截祯
注意事项
- 当前仅支持对视频编码格式为H264的视频文件进行视频截帧。
- OSS当前没有默认保存视频截帧的操作,视频截帧的图片需手动下载到本地。
参数说明
操作名称:snapshot
| 参数 | 描述 | 取值范围 |
|---|---|---|
| t | 指定截图时间。 | [0,视频时长] 单位:ms |
| w | 指定截图宽度,如果指定为0,则自动计算。 | [0,视频宽度] 单位:像素(px) |
| h | 指定截图高度,如果指定为0,则自动计算;如果w和h都为0,则输出为原视频宽高。 | [0,视频高度] 单位:像素(px) |
| m | 指定截图模式,不指定则为默认模式,根据时间精确截图。如果指定为fast,则截取该时间点之前的最近的一个关键帧。 | 枚举值:fast |
| f | 指定输出图片的格式。 | 枚举值:jpg、png |
| ar | 指定是否根据视频信息自动旋转图片。如果指定为auto,则会在截图生成之后根据视频旋转信息进行自动旋转。 | 枚举值:auto |
https://help.aliyun.com/document_detail/64555.html
音视频处理
存储在OSS上的多媒体音视频数据,可以通过经济、弹性、高扩展的阿里云媒体转码服务,转换成适合在移动端、PC、TV上播放的格式。
媒体转码核心能力包括:
- 转换媒体格式,支持多平台播放。
- 保证相同画质质量的前提下,调整视频码率、提高视频压缩效率、减小文件体积,从而减少播放卡顿并节省存储空间和流量费用。
- 添加水印logo,突出品牌,增加产品识别度。
- 对视频进行剪辑/拼接等二次创作。
- 针对画质较差的视频,去除画面中的毛刺、马赛克等,修复为高清晰版本。
智能媒体管理(IMM)
阿里云 OSS 能够与智能媒体管理(IMM)深度结合,支持文档预览、文档格式转换、人脸识别、图片分析、二维码识别等丰富的数据分析处理操作。下面介绍如何在 OSS 控制台中使用 IMM 的功能。
前提条件
- 要在 OSS 中使用 IMM 功能,您需要开通 IMM 服务并进行授权。有关开通服务及授权的详细步骤,请参见开通产品及创建项目中的前提条件部分。
- 如果您使用 RAM 子账号进行本文中的操作,需要同时开通对应存储空间的访问权限和 AliyunIMMFullAccess 权限。
- 创建 IMM Project 及使用 IMM 功能会产生一定的费用,如果您不需要使用 IMM 的功能,请及时解绑 IMM。详细费用请参见计费说明。
https://test-imgs.oss-cn-beijing.aliyuncs.com/1.png?x-ossprocess=imm/detecface
https://test-imgs.oss-cn-beijing.aliyuncs.com/1.png?x-ossprocess=imm/tagimage
CDN 加速 (阿里 网宿 微软 亚马逊 akmai)
对象存储OSS与阿里云CDN服务结合,可优化静态热点文件下载加速的场景(即同一地区大量用户同时下载同一个静态文件的场景)。您可以将OSS的存储空间(Bucket)作为源站,利用阿里云CDN将源内容发布到边缘节点。当大量终端用户重复访问同一文件时,可以直接从边缘节点获取已缓存的数据,提高访问的响应速度。

适用场景:
- 静态文件访问量大,服务器负载高,I/O问题导致用户访问卡顿。
- 静态文件数量大,服务器存储空间不够。
- 静态文件用户访问分布在各地,同一个地区客户,会成千上万次重复下载同一文件。
评论已关闭