COS腾讯云对象存储的集成

这篇博客详细介绍了如何在Android应用中集成腾讯云对象存储COS,包括注册腾讯云账号、创建存储桶、集成SDK、初始化COSClient以及解决在Android端获取签名、创建目录、文件上传过程中遇到的问题。同时,文中还探讨了如何处理中文文件名的下载问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博客谈的是前段时间接触的腾讯云对象存储的集成和具体使用。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() {
  
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值