
{"key":"qiniu.jpg","hash":"Ftgm-CkWePC9fzMBTRNmPMhGBcSV","bucket":"if-bc","fsize":39335}
里面生成的自定义上传回复的上传凭证适用于上传端(无论是客户端还是服务端)和服务器之间进行直接交互的现象下。在客户端上传的画面之下,有时候客户端需要在文档上传到以后,从业务服务器获取相关的资料,这个时候就要用到的上传回调及相关回调参数的设置。
String accessKey = "access key";
String secretKey = "secret key";
String bucket = "bucket name";
Auth auth = Auth.create(accessKey, secretKey);
StringMap putPolicy = new StringMap();
putPolicy.put("callbackUrl", "http://api.example.com/qiniu/upload/callback");
putPolicy.put("callbackBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize)}");
putPolicy.put("callbackBodyType", "application/json");
long expireSeconds = 3600;
String upToken = auth.uploadToken(bucket, null, expireSeconds, putPolicy);
System.out.println(upToken);
在使用了上传回调的现象下,客户端收到的回复就是业务服务器响应的JSON格式内容。
通常状况下,我们建议使用application/json格式来设置callbackBody,维持数据文档的统一性。实际状况下,callbackBody也支持application/x-www-form-urlencoded格式来组织内容,这个主要看业务服务器在接收到callbackBody的内容时怎么解析。例如:
String accessKey = "access key";
String secretKey = "secret key";
String bucket = "bucket name";
Auth auth = Auth.create(accessKey, secretKey);
StringMap putPolicy = new StringMap();
putPolicy.put("callbackUrl", "http://api.example.com/qiniu/upload/callback");
putPolicy.put("callbackBody", "key=$(key)&hash=$(etag)&bucket=$(bucket)&fsize=$(fsize)");
long expireSeconds = 3600;
String upToken = auth.uploadToken(bucket, null, expireSeconds, putPolicy);
System.out.println(upToken);
七牛支持在文档上传到以后,马上对其进行多种指令的数据处理,这个只需要在生成的上传凭证中指定相关的处理参数即可。
String accessKey = "access key";
String secretKey = "secret key";
String bucket = "bucket name";
Auth auth = Auth.create(accessKey, secretKey);
StringMap putPolicy = new StringMap();
//数据处理指令,支持多个指令
String saveMp4Entry = String.format("%s:avthumb_test_target.mp4", bucket);
String saveJpgEntry = String.format("%s:vframe_test_target.jpg", bucket);
String avthumbMp4Fop = String.format("avthumb/mp4|saveas/%s", UrlSafeBase64.encodeToString(saveMp4Entry));
String vframeJpgFop = String.format("vframe/jpg/offset/1|saveas/%s", UrlSafeBase64.encodeToString(saveJpgEntry));
//将多个数据处理指令拼接起来
String persistentOpfs = StringUtils.join(new String[]{
avthumbMp4Fop, vframeJpgFop
}, ";");
putPolicy.put("persistentOps", persistentOpfs);
//数据处理队列名称,必填
putPolicy.put("persistentPipeline", "mps-pipe1");
//数据处理完成结果通知地址
putPolicy.put("persistentNotifyUrl", "http://api.example.com/qiniu/pfop/notify");
long expireSeconds = 3600;
String upToken = auth.uploadToken(bucket, null, expireSeconds, putPolicy);
System.out.println(upToken);
队列 pipeline 请参阅创建私有队列;转码操作详细取值请参阅音视频转码;saveas 请参阅处理结果另存。
七牛支持客户端上传文档的时候定义一些自定义参数,这种取值可以在returnBody和callbackBody里面和内置支持的魔力变量(即模块函数)通过相似的方法来引用。这些自定义的取值名称必须以x:结尾。例如客户端上传的时候指定了自定义的取值x:user和x:age分别是String和int类型。那么可以通过上面的方法引用:
putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize),\"user\":\"$(x:user)\",\"age\",$(x:age)}");
如果
putPolicy.put("callbackBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize),\"user\":\"$(x:user)\",\"age\",$(x:age)}");
里面的合成上传凭证的方式,都是通过增设上传策略相关的取值来支持的,这种取值可以通过不同的组合形式来满足不同的业务需求,可以灵活地组织你所需要的上传凭证。
默认会放弃不在预定义集中的取值。即:
String upToken = auth.uploadToken(bucket, key, expireSeconds, putPolicy, true);
若允许添加额外参数,可以将参数设置为false。
String upToken = auth.uploadToken(bucket, key, expireSeconds, putPolicy, false);
服务端直传是指顾客借助服务端SDK从服务端直接上传文档到七牛云,交互的双方一般都在机房里面,但是服务端可以自己生成上传凭证,然后借助SDK中的上传逻辑进行上传,最终从获取上传的结果,这个过程中由于双方都是业务服务器七牛云开发者中心,但是很少利用到上传回调的系统,而是直接自定义returnBody来获取自定义的回复内容。
七牛存储支持空间创建在不同的机房,在使用七牛的Java SDK中的UploadManager上传文档之前,必须要建立一个上传用的Configuration对象,在该对象中,可以指定空间对应的Zone以及其它的一些影响上传的取值。
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传

其中关于Zone对象和机房的关系如下:
机房Zone对象
华东
Zone.zone0()
华北
Zone.zone1()
华南
Zone.zone2()
北美
Zone.zoneNa0()
Zone.zoneAs0()
最简单的就是上传本地文件,直接指定文档的完整路径即可上传。
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
//如果是Windows情况下,格式是 D:\\qiniu\\test.png
String localFilePath = "/home/qiniu/test.png";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
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
}
}
可以支持将硬盘中的字符字段上传到空间中。
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
try {
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 (UnsupportedEncodingException ex) {
//ignore
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-118827-1.html
所以盲目乐观要倒霉
但实际利率上浮不再设上限
#杨洋icon##杨洋2015金投赏#棒