一、七牛云上传逻辑以及基本属性
七牛云作为第三方文件存储服务,它的一个亮点在于能够让客户端上传文件的请求直接发送到七牛云的文件存储服务端,绕过了我们的业务服务端,传统的第三方服务往往是将上传文件的请求发送到我们的业务服务,再由业务服务端向七牛云服务端发送上传文件请求,这样做的好处是可以降低业务服务端的负载,要知道上传文件的请求是带着文件数据的,比一般的请求要大很多,七牛云的做法可以降低业务服务端的负载。
(一)上传逻辑
虽然上传文件的请求绕过了服务器,但这并不代表业务服务器不发挥作用,接下来我们来讲一讲客户端直接向七牛云服务端上传文件的顺序
-
向业务服务器发送获取token的请求,再由业务服务端向七牛云端发送创建token的请求,七牛云端生成token后返回给业务服务端,再由业务服务端将token返回给客户端
-
客户端拿到token后,向服务端发送上传文件的请求
注意:最后返回的格式是可以再代码里面自定义的,在向七牛云端发送生成token请求时,设置returnBody的属性来定义
(二)基本属性
accessKey: 3TXiPfgyRqQ_ddudAJnljppLYI1upX //访问key
secretKey: tezQ5Rmy05w7yCecjlEVADxYd //密钥
domainOfBucket: http://resxxxxx.hb-bkt.clouddn.com //加速域名,通过该域名可以快速访问文件
bucket:xc-online //命名空间
dedaline:3600 //token有效时间
二、代码讲解
(一)生成token请求(客户端与七牛云端交互)
@Override
public String generateToken(UploadStrategy uploadStrategy, Map<String, Object> params) {
if (params.get("tokenType").equals("1")) { //1表示获得上传凭证
Auth auth = Auth.create(accessKey, secretKey);
String key = (String) params.get("key");
//设置上传文件后,七牛云端返回给客户端的json格式
StringMap putPolicy = new StringMap();
putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fname\":\"$(fname)\",\"fsize\":$(fsize)}");
putPolicy.put("returnBodyType", "application/json");
//key若不为null则表示上传的文件会对某名字等于key的文件进行覆盖,若七牛云端不存在名字等于key的文件,则报错
//key设为null表示普通上传,由于我们不是覆盖某文件,所以将key设为null
String upToken = auth.uploadToken(uploadStrategy.getScope(), null, uploadStrategy.getDeadline(), putPolicy, false);
return upToken;
} else if (params.get("tokenType").equals("2")) { //2表示获得下载凭证
//TODO 申请获得七牛云的下载凭证
return null;
} else if (params.get("tokenType").equals("3")) { //3表示获得管理凭证
//TODO 申请获得七牛云的管理凭证
return null;
}
return null;
}
(二)服务端传文件给七牛云(服务端与七牛云交互)
上面我们讲了如何让客户端与七牛云交互的逻辑与代码,同时,七牛云也支持我们通过服务端向七牛云发送上传文件的请求,服务端得到回应后,再返回给客户端。
public FileObject uploadOnce(MultipartFile file,String bucket,String resourceKey,Long deadline){
Auth auth = Auth.create(accessKey, secretKey);
StringMap putPolicy = new StringMap();
//设置上传文件后七牛云向我们返回的格式
putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fname\":\"$(fname)\",\"fsize\":$(fsize)}");
putPolicy.put("returnBodyType", "application/json");
String uploadToken = auth.uploadToken(bucket, null, deadline, putPolicy, false);
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone1());
//其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
try {
Response file_response = uploadManager.put(file.getInputStream(), resourceKey, uploadToken, null, null);
//解析上传成功的结果
DefaultPutRet file_putRet = new Gson().fromJson(file_response.bodyString(), DefaultPutRet.class);
if (file_response.statusCode != 200) {
return null;
}
FileObject fileObject = new FileObject();
fileObject.setFileName(file.getOriginalFilename());
fileObject.setOrigin("qiniu");
fileObject.setResourceKey(file_putRet.key);
fileObject.setProtect(true);
fileObject.setUploadDate(LocalDateTime.now());
return fileObject;
}catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
return null;
}
}
更多操作,请访问:https://developer.qiniu.com/kodo/1239/java