七牛云存储
一. 概述
七牛云对象存储服务提供高可靠,强安全,低成本,可扩展的非结构化数据的存储服务。它提供简单的Web服务接口,可以通过七牛开发者平台或客户端存储和检索任意数量的数据,指出“按使用付费”模式,可以通过调用REST API接口和SDK卡法工具白访问,下载协议采用HTTP和HTTPS协议。方便程序员聚焦业务应用,而无需关注底层存储实现技术。
使用七牛云实现图片存储也比较简单,只需按照如下步骤操作即可:
- 申请七牛云账户
- 创建空间Bucket
- 上传文件
- 请求获取图片
二. 操作
1. 进入七牛云官方网站注册开发者账户https://www.qiniu.com
七牛云是通过邮箱注册的,注册激活后就进行认证,认证后即可开通对象存储业务了。要注意的是注册成功后一定要先进行是实名认证,否则加下来的操作可能无法进行。
2. 创建存储空间 Bucket
点击左侧左侧菜单 对象存储,一开始我们需要新建一个存储空间来存放我们的图片资源。点击新建存储空间,设置一些需要的内容,然后在左侧的存储空间列表我们就可以看到新加的空间了。
账号注册有些需要注意的点如下:
- 注册账号之后需要实名认证(个人/企业)
- 实名认证之后才可以创建存储空间
- 存储空间创建成功之后,找到个人中心获取accessKey,secretKey和存储空间名称就可以进行上操作了
3. 关于密钥
可以在个人中心的密钥管理中找到:
4. 官方SDK
https://developer.qiniu.com/kodo/sdk/1239/java#upload-resumable
三. 入门案例
七牛对象存储将数据文件以资源的形式上传到空间中。可以创建一个或者多个空间,然后向每个空间中上传一个或多个文件。通过获取已上传文件的地址进行文件的分享和下载。
1. 添加pom依赖
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
2. 通过SDK上传图片
/**
* 将图片上传到七牛云服务(实际开发中将用户id设置成key)
* 1.更新用户图片信息(用户id=key)
* 2.访问图片
* 存储空间分配的:http://pkbivgfrm.bkt.clouddn.com
* 上传的文件名
* 更新图片之后:访问的时候,再请求连接添加上时间戳
*
*/
@Test
public void testUpload01(){
//构造一个带指定Zone对象的配置类
//指定上传文件服务器地址:
Configuration cfg = new Configuration(Zone.autoZone());
//...其他参数参考类注释
//上传管理器
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
//公钥
String accessKey = "xxx";
//密钥
String secretKey = "xxx";
//存储空间名称
String bucket = "xxx";
//图片路径
String localFilePath = "D:\\IdeaWorkSpace\\03-SaasHRM\\qiniu-test\\src\\main\\resources\\image\\002.png";
//存入到存储空间的文件名
String key = "test";
//身份认证
Auth auth = Auth.create(accessKey, secretKey);
//指定覆盖上传, 若不指定第二个参数key则不支持覆盖上传
String uploadToken = auth.uploadToken(bucket, key);
try {
//上传
Response response = uploadManager.put(localFilePath, key, uploadToken);
//解析上传成功的结果
DefaultPutRet defaultPutRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(defaultPutRet.key);
System.out.println(defaultPutRet.hash);
} catch (QiniuException e) {
Response response = e.response;
System.err.println(response.toString());
try {
System.err.println(response.bodyString());
} catch (QiniuException e1) {
//ignore
}
}
}
运行图片文件上传代码,上传成功后如下图所示:
注意:
(1)想要访问上传的图片,需要 域名 + “/” + key(域名就是上图中的外链默认域名)
例如:http://polmpxzzs.bkt.clouddn.com/test
(2)七牛云的图片上传具有一定的缓存机制,若是替换了图片后继续访问该链接可能还是上一张图片,这时要在url后加上一个随机字符串(可使用当前时间的时间戳)
例如:http://polmpxzzs.bkt.clouddn.com/test?t=123
3. 断点续传
//断点续传
@Test
public void testUpload02() {
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释
//...生成上传凭证,然后准备上传
String accessKey = "xxx";
String secretKey = "xxx";
String bucket = "xxx";
//如果是Windows情况下,格式是 D:\\qiniu\\test.png
String localFilePath = "D:\\IdeaWorkSpace\\03-SaasHRM\\qiniu-test\\src\\main\\resources\\test.xlsx";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = "testExcel";
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
//断点续传:
String localTempDir = Paths.get(System.getProperty("java.io.tmpdir"), bucket).toString();
System.out.println(localTempDir);
try {
//设置断点续传文件进度保存目录
FileRecorder fileRecorder = new FileRecorder(localTempDir);
UploadManager uploadManager = new UploadManager(cfg, fileRecorder);
try {
Response response = uploadManager.put(localFilePath, 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) {
ex.printStackTrace();
}
}
在断点上传的中途停下后,会打印出临时文件的存储位置。该文件就是我们文件断点上传的具体信息。
四. 封装工具类
package com.ihrm.common.utils;
import com.google.gson.Gson;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import java.util.Date;
public class QiniuUploadUtil {
private static final String accessKey = "xxx";//公钥
private static final String secretKey = "xxx";//密钥
private static final String bucket = "xxx";//空间名
private static final String prix = "http://xxx/";//外链地址
private UploadManager manager;
public QiniuUploadUtil() {
//初始化基本配置
Configuration cfg = new Configuration(Zone.zone0());
//创建上传管理器
manager = new UploadManager(cfg);
}
//文件名 = key
//文件的byte数组
public String upload(String imgName , byte [] bytes) {
Auth auth = Auth.create(accessKey, secretKey);
//构造覆盖上传token
String upToken = auth.uploadToken(bucket,imgName);
try {
Response response = manager.put(bytes, imgName, upToken);
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
//返回请求地址
return prix+putRet.key+"?t="+new Date().getTime();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}