本篇博客谈的是前段时间接触的腾讯云对象存储的集成和具体使用。sdk并不复杂,主要是腾讯云的文档没怎么更新,很多地方讲解的也不清晰,我已多次入坑所以想要写一篇相关的博客,好了进入正题。
基础版Demo:http://download.youkuaiyun.com/detail/g_ying_jie/9909448
功能演进版Demo:http://download.youkuaiyun.com/detail/g_ying_jie/9924321
仿微云终极Demo:http://download.youkuaiyun.com/download/g_ying_jie/9959175
第一步、注册腾讯云:https://www.qcloud.com/register
第二步、登陆控制台创建存储桶:https://console.qcloud.com/cos4/bucket
第三步、下载Android SDK并集成so库和jar包,配置相关环境和权限(以前的腾讯云直播~上谈过很多了这里就不再提了),相关官网链接
第四步、初始化COSClient对象,对应demo的BizService类有详细用法
String appid = "腾讯云注册的appid";
Context context = getApplicationContext();
String peristenceId = "持久化Id";
//创建COSClientConfig对象,根据需要修改默认的配置参数
COSClientConfig config = new COSClientConfig();
/**
* 设置园区;根据创建的cos空间时选择的园区
* 华南园区:gz 或 COSEndPoint.COS_GZ(已上线)
* 华北园区:tj 或 COSEndPoint.COS_TJ(已上线)
* 华东园区:sh 或 COSEndPoint.COS_SH
*/
config.setEndPoint(COSEndPoint.COS_GZ);
//创建COSlient对象,实现对象存储的操作
COSClient cos = new COSClient(context,appid,config,peristenceId);
第五步、生成签名,详细用法可以下载demo的BizService类
这一步很重要,也是拦住了很多人的第一个坎,因为腾讯官方用的PHP作为示例,更令人无语的是官方提供的Android SDK的demo没有提到拼接签名,demo直接请求腾讯的服务器获取的单次有效和多次有效签名。废话不多说,下面介绍Android端如何获取单次有效和多次有效签名
①生成单次有效签名
public String getSignOnce(String cosPath) {
try {
String Original = getSignOriginalOnce(cosPath);
byte[] HmacSHA1 = HmacSHA1Encrypt(SecretKey, Original);
byte[] all = new byte[HmacSHA1.length + Original.getBytes(ENCODING).length];
System.arraycopy(HmacSHA1, 0, all, 0, HmacSHA1.length);
System.arraycopy(Original.getBytes(ENCODING), 0, all, HmacSHA1.length, Original.getBytes(ENCODING).length);
String SignData = Base64Util.encode(all);
return SignData;
} catch (Exception e) {
e.printStackTrace();
}
return "get sign failed";
}
/**
* @param SecretKey 密钥
* @param EncryptText 签名串
*/
private byte[] HmacSHA1Encrypt(String SecretKey, String EncryptText) throws Exception {
byte[] data = SecretKey.getBytes(ENCODING);
javax.crypto.SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
Mac mac = Mac.getInstance(MAC_NAME);
mac.init(secretKey);
byte[] text = EncryptText.getBytes(ENCODING);
return mac.doFinal(text);
}
/**
*getLinuxDateSimple()获取时间戳,单位秒
* getRandomTenStr()获取随机数
*/
private String getSignOriginalOnce(String cosPath) {
return String.format(
"a=%s&b=%s&k=%s&e=%s&t=%s&r=%s&f=%s",
appid,
bucket,
SecretId,
"0",
String.valueOf(getLinuxDateSimple()),
getRandomTenStr(),
"/" + appid + "/" + bucket + "/" + cosPath);
}
②生成多次有效签名
public String getSign() {
try {
String Original = getSignOriginal();
byte[] HmacSHA1 = HmacSHA1Encrypt(SecretKey, Original);
byte[] all = new byte[HmacSHA1.length + Original.getBytes(ENCODING).length];
System.arraycopy(HmacSHA1, 0, all, 0, HmacSHA1.length);
System.arraycopy(Original.getBytes(ENCODING), 0, all, HmacSHA1.length, Original.getBytes(ENCODING).length);
String SignData = Base64Util.encode(all);
return SignData;
} catch (Exception e) {
e.printStackTrace();
}
return "get sign failed";
}
//e=%s表示签名到期时间戳
private String getSignOriginal() {
return String.format(
"a=%s&b=%s&k=%s&e=%s&t=%s&r=%s&f=",
appid,
bucket,
SecretId,
String.valueOf(getLinuxDateSimple() + 60),
String.valueOf(getLinuxDateSimple()),
getRandomTenStr());
}
第六步,目录操作
①创建目录
此处注意:createDirRequest.setBiz_attr(biz_attr);这个请求参数请不要添加,会报-5999参数出错的错误码。具体原因不明但肯定不是参数错误的原因,因为其他的目录包括文件操作都是正常的只有目录创建会失败,我用官方的demo同样存在这个问题,已经反馈给腾讯客服。
/**
* 创建多层目录 dirName = gu/test; dirName.length()<=20
*/
public void createDir() {
final String dirName = "gu/test";
new Thread(new Runnable() {