
欢迎来到预见猿份,本站项目均为站长原创,学习中有问题可直接提交给站长老苗解决(微信:mrt_0607)。
苗润土老师,20余年一线项目经验,2014年加入黑马,星辰wms、云岚到家、学成在线项目作者,历任高级讲师、教学主管及课程研究员。 b站老苗
七牛云对象存储使用指南
1 对象存储服务简介
七牛云海量存储系统(KODO)是自主研发的非结构化数据存储管理平台,支持中心和边缘存储。平台经过多年大规模用户验证已跻身先进技术行列,并广泛应用于海量数据管理的各类场景。

详细介绍参考官网:https://www.qiniu.com/products/kodo
1.1 产品优势
高可靠
业界领先的纠删码存储方案,能够提供高达 11 个 9 的数据可靠性。跨数据中心的副本冗余,能够保障服务的超高可用性。
低成本
无需前期投入。七牛云对象存储按需使用、按需付费的便捷性,能够有效避免存储及带宽资源的闲置浪费。
存储加速
边缘存储可充分利用可用链路带宽,数据在边缘节点上传和下载可平均提速 60% 以上。
易扩展
利用七牛云对象存储,您的存储空间无上限的同时也无需担心扩容问题。您能够实现存储需求的弹性伸缩,从而提高业务灵活性。
数据智能化
与七牛云其他产品紧密协同,提供标准 HDFS 访问方式,为大数据和机器学习的海量高速读写场景进行了大量优化。
边缘计算
就近集成边缘计算及边缘缓存服务,边缘存储节点具备本地数据处理能力。
1.2 核心功能及服务
多媒体数据处理
基于对象存储,您可以一站式地完成图片处理和音视频处理
镜像存储
镜像存储适用于迁移原有业务系统的已有数据。可以帮助用户实现无缝数据迁移,迁移过程中并不影响原有业务系统的访问。
上传/下载
针对不同的上传/下载场景,七牛云提供了丰富的API接口和工具供用户使用,同时支持服务端上传和客户端直传,并提供加速服务。
灵活部署
同时支持在七牛云边缘节点和客户侧边缘节点部署边缘存储服务。
多级备份
提供边缘和中心多级服务备份。
边缘安全
通信加密,及时脱敏,边缘存储数据具备网银级安全可靠性。
2 创建对象存储空间
注册七牛云账号:https://portal.qiniu.com/signup
开通对象存储服务:https://www.qiniu.com/products/kodo

新建存储空间:https://portal.qiniu.com/bucket/create
选择服务器所在区域,访问控制方式。
公开空间可实现无需认证即可下载空间中的文件。

创建成功,获取融合 CDN 测试域名:下载文件时需要使用此域名

获取七牛云服务秘钥:https://portal.qiniu.com/user/key

3 上传文件测试
官方提供了Java SDK来方便开发。
3.1 Java SDK简介
使用此 SDK 构建您的网络应用程序,能让您以非常便捷地方式将数据安全地存储到七牛云上。无论您的网络应用是一个网站程序,还是包括从云端(服务端程序)到终端(手持设备应用)的架构服务或应用,通过七牛云及其 SDK,都能让您应用程序的终端用户高速上传和下载,同时也让您的服务端更加轻盈。
Java SDK 属于七牛服务端SDK之一,主要有如下功能:
- 提供生成客户端上传所需的上传凭证的功能
- 提供文件从服务端直接上传七牛的功能
- 提供对七牛空间中文件进行管理的功能
- 提供对七牛空间中文件进行处理的功能
- 提供七牛CDN相关的刷新,预取,日志功能
详细内容参考官网:https://developer.qiniu.com/kodo/sdk/1239/java
3.2 使用SDK上传文件
在项目中引入依赖,在common工程添加以下依赖。
xml<dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>7.2.25</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>在Common工程下编写七牛云的工具类QiniuUtils
package com.shanjupay.common.util; import com.alibaba.fastjson.JSON; import com.google.gson.Gson; import com.qiniu.common.QiniuException; import com.qiniu.http.Response; import com.qiniu.storage.Configuration; import com.qiniu.storage.Region; import com.qiniu.storage.UploadManager; import com.qiniu.storage.model.DefaultPutRet; import com.qiniu.util.Auth; public class QiniuUtils { }将七牛云的AccessKey/SecretKey和存储空间名配置到代码中:https://portal.qiniu.com/user/key
javapublic static String accessKey = ""; public static String secretKey = ""; public static String bucket = "";调用SDK上传文件
参考官方提供的方法,这里测试字节数组上传方法:

java//上传测试 private static void testUpload(){ //构造一个带指定 Region 对象的配置类 Configuration cfg = new Configuration(Region.huanan()); //...其他参数参考类注释 UploadManager uploadManager = new UploadManager(cfg); //...生成上传凭证,然后准备上传 String accessKey = "vG3krn6ZU9j_KCJEsOW-76A3RxEbgCkN6tkTDOf_"; String secretKey = "p04hR8a1151UXAb0K3GpYznPxAGuSj_9LbegmJuS"; String bucket = "shanjupay-m1"; //默认不指定key的情况下,以文件内容的hash值作为文件名,这里建议由自己来控制文件名 String key = UUID.randomUUID()+".png"; FileInputStream fileInputStream = null; try { //通常这里得到文件的字节数组 fileInputStream = new FileInputStream(new File("F:\\develop\\shanjupay\\1.png")); byte[] uploadBytes = IOUtils.toByteArray(fileInputStream); // byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8"); Auth auth = Auth.create(accessKey, secretKey); String upToken = auth.uploadToken(bucket); try { Response response = uploadManager.put(uploadBytes, key, upToken); //解析上传成功的结果 DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); System.out.println(putRet.key); System.out.println(putRet.hash); } catch (QiniuException ex) { Response r = ex.response; System.err.println(r.toString()); try { System.err.println(r.bodyString()); } catch (QiniuException ex2) { //ignore } } } catch (IOException ex) { //ignore }finally { try { if(fileInputStream!=null){ fileInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } }编写测试方法上传文件
javapublic static void main(String[] args) { //测试上传 QiniuUtils.testUpload(); }
上传测试完成,通过七牛云平台查看上传的文件:https://portal.qiniu.com/bucket,选择上传使用的存储空间查看内容

4 下载文件测试
参考官方文档:

1、公开空间
对于公开空间,文件的访问链接是将空间绑定的域名加文件名称组成。

链接地址为:http://q2cdf3ibb.bkt.clouddn.com/94873f84-3d6f-49da-86d0-98ad4fa68613.png
2、私有空间
私有空间主要存储一些不公开的文件,如果要下载文件则需要通过sdk生成文件访问地址。
首先需要按照公开空间的文件访问方式构建对应的公开空间访问链接,然后再对这个链接进行私有授权签名。
测试代码如下:
//获取文件url
private static void testGetFileUrl() throws UnsupportedEncodingException {
String fileName = "94873f84-3d6f-49da-86d0-98ad4fa68613.png";
String domainOfBucket = "http://q2cdf3ibb.bkt.clouddn.com";
String encodedFileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20");
String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
String accessKey = "vG3krn6ZU9j_KCJEsOW-76A3RxEbgCkN6tkTDOf_";
String secretKey = "p04hR8a1151UXAb0K3GpYznPxAGuSj_9LbegmJuS";
Auth auth = Auth.create(accessKey, secretKey);
long expireInSeconds = 3600;//1小时,可以自定义链接过期时间
String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
System.out.println(finalUrl);
}编写测试方法
public static void main(String[] args) throws UnsupportedEncodingException { //测试上传 // QiniuUtils.testUpload(); //测试获取文件url QiniuUtils.testGetFileUrl(); }执行测试返回下载地址

在浏览器访问下载地址,测试文件是否正确
