转-腾讯对象存储服务COS加密签名

http://blog.csdn.net/jspping/article/details/52538440

 

 

 

 

在做一些用户需求的时候,公司往往需要工程师采集到更多有用的关于用户的个人信息,然后对用户群进行分析,今天我不是来分析这些的,今天我主要是说

腾讯推出的款云产品,那就是对象存储服务COS,这个产品面向所有开发者,新用户都有免费享有10G的使用权,10G可能对于做方案的工程师来说可能是微不

足道的,比如后视镜和车载方案,会常常需要用到视频的存储与云分享,当然这里不是只本地存储哦,我指的是用户在使用方案商的方案的时候,比如他开车

的时候录了一段视频需要分享到某个域,共享给大家看,比如微信,这时候他肯定需要将这个视频存储在一个服务器上,这时候问题来了,如果你们公司够有

钱够任性可以买更好的服务器和配置,那就不需要用到这个COS对象存储产品了,但是就app的和后台的性能来说,这个就很有必要了

比如我目前就在写一个大型的app,初步用户数大概在50万以上,举个简单的小例子,加入今天有2000+个用户同时一起更换用户头像,那这时候对后台的来说

就是影响效率的操作,当然牛逼的服务器配置我们就不再此对比了,那是超大公司的配置,但我们可以将这个样的负荷转移到别的地方,比如COS对象存储,

我们客户端只需要将用户更换头像的图片地址放到后台上传就行了,跟服务器没有任何交互,一但COS存储完毕,我们会收到Response这时候如果是

Success,那我们再向我们自己服务器的后台插入一个COS的头像地址,下次用户重新登录或者登录超时或更换IOS/Android登录,后台返回一个远程COS头

像地址,我们客户端后台获取,轻松完美!当然还有一个小缺陷就是,如果用户是拍照获取头像的话,因为是超清晰的所以比较大,上传可能会异常的慢,而且设置头像的

时候还可能OOM,但这些都是小问题,因为一个头像本来可见范围就那么一点点,我们客户端是可以采取措施的,比如压缩可裁剪,像我就是写了一个裁剪依赖,对较大的

超过1.5MB的头像首先进行压缩,确保它不会失真就得大于30%的压缩率,然后在裁剪,最后把所有用户头像均控制在1MB以内,轻松搞定!

下面开始分享COS的使用和加密签名算法

COS免费10G地址:https://www.qcloud.com/product/cos.html

进入这个链接以后,点击立即使用,随后完成准备工作开始创建 bucket


创建完毕之后,获取API的一些密钥,点击获取API密钥或密钥管理

拿到这些必须的参数以后,就要开始编写校验签名加密程序了,用来访问COS

Android SDK 地址:https://www.qcloud.com/doc/product/227/3391

SDK地址下载下来的Demo是可用的,但是对签名加密那一块压根就没提,甚是恶心,签名都是从自己后台的PHP接口生成返回到客户端的,而且腾讯官方也没有提供相应

的demo,太不负责任了。。。

于是我开始动手写算了,太坑爹了,加密签名需要用 

HMAC-SHA1 对拼接参数进行签名,然后签名串需要使用 Base64 编码

官方给出的提示就如下,其他什么都没有了。。。

SignTmp = HMAC-SHA1(SecretKey, orignal)

Sign = Base64(SignTmp.orignal)

其中SecretKey为2.1节获取的项目Secret Key,orignal为2.2节中拼接好的签名串,首先对orignal使用HMAC-SHA1算法进行签名,然后将orignal附加到签名结果的末尾,再进行Base64编码,得到最终的sign。

注:此处使用的是标准的Base64编码,不是urlsafe的Base64编码,请注意。

这里我还是做一下解释吧,要不然大家都看不懂,HMAC-SHA1函数需要两个参数,一个是SecretKey,这个在API密钥里面获得,另一个是original,这个是需要拼接所有

需要用到的参数,比如:

String Original = “a=%s&b=%s&k=%s&e=%s&t=%s&r=%s&f=”;

a: Appid ,可在API密钥中获取

b: 空间名称bucket,比如笔者上图的 “rmtonline”

k: Secret ID ,可在API密钥中获取

e: 签名的有效期,一个UNIX Epoch时间戳,即签名多久的使用期,最长3个月,从年精确到秒

t:  当前时间的UNIX Epoch时间戳,即签名开始生效的日期,也精确到秒,而且e>t,因为到期日必须大于生效日期

r: 随机串,无符号10进制整数,用户需自行生成,最长10位

f: 这个参数的值可以不填

比如:a=200001&b=newbucket&k=AKIDUfLUEUigQiXqm7CVSspKJnuaiIKtxqAv&e=1438669115&t=1436077115&r=11162&f=

下面开始进行编写签名和加密函数

  1. private static final String MAC_NAME = “HmacSHA1”;
  2. private static final String ENCODING = “UTF-8”;
  3. /**
  4.  * 
  5.  * @param SecretKey
  6.  *            密钥
  7.  * @param EncryptText
  8.  *            签名串
  9.  * @return
  10.  * @throws Exception
  11.  */
  12. public static byte[] HmacSHA1Encrypt(String SecretKey, String EncryptText)
  13.         throws Exception {
  14.     byte[] data = SecretKey.getBytes(ENCODING);
  15.     SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
  16.     Mac mac = Mac.getInstance(MAC_NAME);
  17.     mac.init(secretKey);
  18.     byte[] text = EncryptText.getBytes(ENCODING);
  19.     return mac.doFinal(text);
  20. }

该函数返回一个byte[],SecretKey 为你的secretKey 下面开始拼接original

  1. public static String getSignOriginal() {
  2.     return String.format(TencentUpload.Original,
  3.             ParamPreference.TENCENT_COS_APPID,
  4.             ParamPreference.TENCENT_COS_BUCKET,
  5.             ParamPreference.TENCENT_COS_SECRET_ID,
  6.             String.valueOf(getFurureLinuxDate()),
  7.             String.valueOf(getLinuxDateSimple()), getRandomTenStr());
  8. }

TencentUpload.Original 为待通配字符串:String Original = “a=%s&b=%s&k=%s&e=%s&t=%s&r=%s&f=”ParamPreference.TENCENT_COS_APPID 为常量字符串,即你的appid

ParamPreference.TENCENT_COS_BUCKET 为常量字符串,即你的bucket 名称

ParamPreference.TENCENT_COS_SECRET_ID 为常量字符串,即你的 secretID

String.valueOf(getFurureLinuxDate()) 和 String.valueOf(getLinuxDateSimple()) 为签名生效期和到期日的Linux时间戳

getRandomTenStr() 为随即无符号的int 5-8 位 开头不为0 后面为0-9的转字符串拼接

  1. @SuppressLint(“SimpleDateFormat”)
  2. public static long getFurureLinuxDate() {
  3.     try {
  4.         String futureTime = ParamPreference.TENCENT_COS_FUTURE_LINUXTIME;
  5.         Date date = new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss”)
  6.                 .parse(futureTime);
  7.         long unixTimestamp = date.getTime() / 1000L;
  8.         return unixTimestamp;
  9.     } catch (Exception e) {
  10.         e.printStackTrace();
  11.     }
  12.     return –1;
  13. }
  1. public static long getLinuxDateSimple() {
  2.     try {
  3.         long unixTimestamp = System.currentTimeMillis() / 1000L;
  4.         return unixTimestamp;
  5.     } catch (Exception e) {
  6.         e.printStackTrace();
  7.     }
  8.     return –1;
  9. }
  1. private static String getRandomTenStr() {
  2.     String randomstr = null;
  3.     randomstr = String.valueOf(new Random().nextInt(8) + 1);
  4.     int random = new Random().nextInt(3) + 5;
  5.     for (int i = 0; i < random; i++) {
  6.         randomstr += String.valueOf(new Random().nextInt(9));
  7.     }
  8.     return randomstr;
  9. }


随后需要将他们签名和加密,最后转成标准Base64编码格式,需要注意的是,获取 SIGN 需要将 secretKey 和 original 传入HmacSHA1Encrypt(String SecretKey, String EncryptText)函数,获取到签名的byte[]结果后,还需要在其后面
追加 original 最后再进行Base64编码转码得的 SIGN

编写代码如下:

  1. public String getTencentSign() {
  2.     try {
  3.         String Original = TencentUtils.getSignOriginal();
  4.         byte[] HmacSHA1 = TencentUtils.HmacSHA1Encrypt(
  5.                 ParamPreference.TENCENT_COS_SECRET_KEY, Original);
  6.         byte[] all = new byte[HmacSHA1.length
  7.                 + Original.getBytes(ENCODING).length];
  8.         System.arraycopy(HmacSHA1, 0, all, 0, HmacSHA1.length);
  9.         System.arraycopy(Original.getBytes(ENCODING), 0, all,
  10.                 HmacSHA1.length, Original.getBytes(ENCODING).length);
  11.         if (DEBUG) {
  12.             Log.v(TencentUpload.TAG, “getTencentSign() Original:\n”
  13.                     + Original);
  14.         }
  15.         String SignData = Base64Util.encode(all);
  16.         if (DEBUG) {
  17.             Log.v(TencentUpload.TAG, “getTencentSign() SignData:\n”
  18.                     + SignData);
  19.         }
  20.         return SignData;
  21.     } catch (Exception e) {
  22.         e.printStackTrace();
  23.     }
  24.     return “get sign failed”;
  25. }

ParamPreference.TENCENT_COS_SECRET_KEY 为常量字符串,即你的 secretKeyBase64Util:

  1. package com.rmt.online.tools;
  2. import java.io.ByteArrayOutputStream;
  3. public class Base64Util {
  4.     private static final char[] base64EncodeChars = new char[] { ‘A’‘B’‘C’,
  5.             ‘D’‘E’‘F’‘G’‘H’‘I’‘J’‘K’‘L’‘M’‘N’‘O’‘P’,
  6.             ‘Q’‘R’‘S’‘T’‘U’‘V’‘W’‘X’‘Y’‘Z’‘a’‘b’‘c’,
  7.             ‘d’‘e’‘f’‘g’‘h’‘i’‘j’‘k’‘l’‘m’‘n’‘o’‘p’,
  8.             ‘q’‘r’‘s’‘t’‘u’‘v’‘w’‘x’‘y’‘z’‘0’‘1’‘2’,
  9.             ‘3’‘4’‘5’‘6’‘7’‘8’‘9’‘+’‘/’ };
  10.     private static byte[] base64DecodeChars = new byte[] { –1, –1, –1, –1, –1,
  11.             –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1,
  12.             –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1, –1,
  13.             –1, –1, –1, –162, –1, –1, –1635253545556575859,
  14.             6061, –1, –1, –1, –1, –1, –1, –10123456789,
  15.             10111213141516171819202122232425, –1,
  16.             –1, –1, –1, –1, –1262728293031323334353637,
  17.             3839404142434445464748495051, –1, –1, –1,
  18.             –1, –1 };
  19.     private Base64Util() {
  20.     }
  21.     public static String encode(byte[] data) {
  22.         StringBuffer sb = new StringBuffer();
  23.         int len = data.length;
  24.         int i = 0;
  25.         int b1, b2, b3;
  26.         while (i < len) {
  27.             b1 = data[i++] & 0xff;
  28.             if (i == len) {
  29.                 sb.append(base64EncodeChars[b1 >>> 2]);
  30.                 sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
  31.                 sb.append(“==”);
  32.                 break;
  33.             }
  34.             b2 = data[i++] & 0xff;
  35.             if (i == len) {
  36.                 sb.append(base64EncodeChars[b1 >>> 2]);
  37.                 sb.append(base64EncodeChars[((b1 & 0x03) << 4)
  38.                         | ((b2 & 0xf0) >>> 4)]);
  39.                 sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
  40.                 sb.append(“=”);
  41.                 break;
  42.             }
  43.             b3 = data[i++] & 0xff;
  44.             sb.append(base64EncodeChars[b1 >>> 2]);
  45.             sb.append(base64EncodeChars[((b1 & 0x03) << 4)
  46.                     | ((b2 & 0xf0) >>> 4)]);
  47.             sb.append(base64EncodeChars[((b2 & 0x0f) << 2)
  48.                     | ((b3 & 0xc0) >>> 6)]);
  49.             sb.append(base64EncodeChars[b3 & 0x3f]);
  50.         }
  51.         return sb.toString();
  52.     }
  53.     public static byte[] decode(String str) {
  54.         byte[] data = str.getBytes();
  55.         int len = data.length;
  56.         ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
  57.         int i = 0;
  58.         int b1, b2, b3, b4;
  59.         while (i < len) { /* b1 */
  60.             do {
  61.                 b1 = base64DecodeChars[data[i++]];
  62.             } while (i < len && b1 == –1);
  63.             if (b1 == –1) {
  64.                 break;
  65.             } /* b2 */
  66.             do {
  67.                 b2 = base64DecodeChars[data[i++]];
  68.             } while (i < len && b2 == –1);
  69.             if (b2 == –1) {
  70.                 break;
  71.             }
  72.             buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4))); /* b3 */
  73.             do {
  74.                 b3 = data[i++];
  75.                 if (b3 == 61) {
  76.                     return buf.toByteArray();
  77.                 }
  78.                 b3 = base64DecodeChars[b3];
  79.             } while (i < len && b3 == –1);
  80.             if (b3 == –1) {
  81.                 break;
  82.             }
  83.             buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); /* b4 */
  84.             do {
  85.                 b4 = data[i++];
  86.                 if (b4 == 61) {
  87.                     return buf.toByteArray();
  88.                 }
  89.                 b4 = base64DecodeChars[b4];
  90.             } while (i < len && b4 == –1);
  91.             if (b4 == –1) {
  92.                 break;
  93.             }
  94.             buf.write((int) (((b3 & 0x03) << 6) | b4));
  95.         }
  96.         return buf.toByteArray();
  97.     }
  98.     public static void main(String[] args) throws Exception {
  99.         System.out.println(encode(“liao”.getBytes()));
  100.         System.out.println(new String(decode(encode(“1”.getBytes()))));
  101.     }
  102. }

最后附上工具类代码:

  1. package com.rmt.online.tools;
  2. /**
  3.  * class:  TencentUtils
  4.  * author: Engineer-Jsp
  5.  * use:    Tencent cos cdn upload and download utils
  6.  * date:   2016/09/14
  7.  * */
  8. import java.text.SimpleDateFormat;
  9. import java.util.Date;
  10. import java.util.Random;
  11. import javax.crypto.Mac;
  12. import javax.crypto.SecretKey;
  13. import javax.crypto.spec.SecretKeySpec;
  14. import android.annotation.SuppressLint;
  15. import android.content.Context;
  16. import android.graphics.Bitmap;
  17. import android.graphics.BitmapFactory;
  18. import android.util.Log;
  19. import com.rmt.online.preference.ParamPreference;
  20. import com.tencent.download.Downloader;
  21. import com.tencent.download.core.DownloadResult;
  22. import com.tencent.upload.UploadManager;
  23. import com.tencent.upload.Const.FileType;
  24. import com.tencent.upload.task.IUploadTaskListener;
  25. import com.tencent.upload.task.ITask.TaskState;
  26. import com.tencent.upload.task.data.FileInfo;
  27. import com.tencent.upload.task.impl.FileUploadTask;
  28. public class TencentUtils {
  29.     public static boolean DEBUG = true;
  30.     private static final String MAC_NAME = “HmacSHA1”;
  31.     private static final String ENCODING = “UTF-8”;
  32.     /**
  33.      * 
  34.      * @param SecretKey
  35.      *            密钥
  36.      * @param EncryptText
  37.      *            签名串
  38.      * @return
  39.      * @throws Exception
  40.      */
  41.     public static byte[] HmacSHA1Encrypt(String SecretKey, String EncryptText)
  42.             throws Exception {
  43.         byte[] data = SecretKey.getBytes(ENCODING);
  44.         SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
  45.         Mac mac = Mac.getInstance(MAC_NAME);
  46.         mac.init(secretKey);
  47.         byte[] text = EncryptText.getBytes(ENCODING);
  48.         return mac.doFinal(text);
  49.     }
  50.     public static long getLinuxDateSimple() {
  51.         try {
  52.             long unixTimestamp = System.currentTimeMillis() / 1000L;
  53.             return unixTimestamp;
  54.         } catch (Exception e) {
  55.             e.printStackTrace();
  56.         }
  57.         return –1;
  58.     }
  59.     @SuppressLint(“SimpleDateFormat”)
  60.     public static long getFurureLinuxDate() {
  61.         try {
  62.             String futureTime = ParamPreference.TENCENT_COS_FUTURE_LINUXTIME;
  63.             Date date = new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss”)
  64.                     .parse(futureTime);
  65.             long unixTimestamp = date.getTime() / 1000L;
  66.             return unixTimestamp;
  67.         } catch (Exception e) {
  68.             e.printStackTrace();
  69.         }
  70.         return –1;
  71.     }
  72.     private static String getRandomTenStr() {
  73.         String randomstr = null;
  74.         randomstr = String.valueOf(new Random().nextInt(8) + 1);
  75.         int random = new Random().nextInt(3) + 5;
  76.         for (int i = 0; i < random; i++) {
  77.             randomstr += String.valueOf(new Random().nextInt(9));
  78.         }
  79.         return randomstr;
  80.     }
  81.     public static String getSignOriginal() {
  82.         return String.format(TencentUpload.Original,
  83.                 ParamPreference.TENCENT_COS_APPID,
  84.                 ParamPreference.TENCENT_COS_BUCKET,
  85.                 ParamPreference.TENCENT_COS_SECRET_ID,
  86.                 String.valueOf(getFurureLinuxDate()),
  87.                 String.valueOf(getLinuxDateSimple()), getRandomTenStr());
  88.     }
  89.     public static class TencentUpload {
  90.         public static final String TAG = “TencentUpload”;
  91.         private static UploadManager mFileUploadManager = null;
  92.         private FileUploadTask fileUploadTask = null;
  93.         public static String Original = “a=%s&b=%s&k=%s&e=%s&t=%s&r=%s&f=”;
  94.         private static TencentUpload mTencentUpload = null;
  95.         private static Context mContext = null;
  96.         public static TencentUpload initTencentUpload(Context context) {
  97.             mContext = context;
  98.             if (mTencentUpload == null) {
  99.                 mTencentUpload = new TencentUpload();
  100.             }
  101.             if (mFileUploadManager == null) {
  102.                 mFileUploadManager = new UploadManager(context,
  103.                         ParamPreference.TENCENT_COS_APPID, FileType.File,
  104.                         ParamPreference.TENCENT_COS_PERSISTENCEID);
  105.             }
  106.             return mTencentUpload;
  107.         }
  108.         public void statrtUpLoad(String loacFilePath, String filename) {
  109.             if (DEBUG) {
  110.                 Log.v(TAG, “DEBUG:” + “\nbucket:”
  111.                         + ParamPreference.TENCENT_COS_BUCKET + “\nsrcFilePath:”
  112.                         + loacFilePath + “\ndestPath:” + “/” + filename);
  113.             }
  114.             fileUploadTask = new FileUploadTask(
  115.                     ParamPreference.TENCENT_COS_BUCKET, loacFilePath, “/”
  116.                             + filename, “”falsenew IUploadTaskListener() {
  117.                         @Override
  118.                         public void onUploadFailed(final int errorCode,
  119.                                 final String errorMsg) {
  120.                             Log.v(TAG, “上传失败 ret:” + errorCode + ” msg:”
  121.                                     + errorMsg);
  122.                         }
  123.                         @Override
  124.                         public void onUploadProgress(final long totalSize,
  125.                                 final long sendSize) {
  126.                             long p = (long) ((sendSize * 100) / (totalSize * 1.0f));
  127.                             Log.v(TAG, “上传中: “ + p + “%”);
  128.                         }
  129.                         @Override
  130.                         public void onUploadStateChange(TaskState arg0) {
  131.                         }
  132.                         @Override
  133.                         public void onUploadSucceed(final FileInfo result) {
  134.                             Log.v(TAG, “上传成功,下载路径: “ + result.url);
  135.                             if (DEBUG) {
  136.                                 if (mContext == null) {
  137.                                     return;
  138.                                 }
  139.                                 TencentDownload.initTencentDownload(mContext)
  140.                                         .startDownLoad(result.url);
  141.                             }
  142.                         }
  143.                     });
  144.             try {
  145.                 fileUploadTask.setAuth(getTencentSign());
  146.                 mFileUploadManager.upload(fileUploadTask);
  147.             } catch (Exception e) {
  148.                 e.printStackTrace();
  149.             }
  150.         }
  151.         public String getTencentSign() {
  152.             try {
  153.                 String Original = TencentUtils.getSignOriginal();
  154.                 byte[] HmacSHA1 = TencentUtils.HmacSHA1Encrypt(
  155.                         ParamPreference.TENCENT_COS_SECRET_KEY, Original);
  156.                 byte[] all = new byte[HmacSHA1.length
  157.                         + Original.getBytes(ENCODING).length];
  158.                 System.arraycopy(HmacSHA1, 0, all, 0, HmacSHA1.length);
  159.                 System.arraycopy(Original.getBytes(ENCODING), 0, all,
  160.                         HmacSHA1.length, Original.getBytes(ENCODING).length);
  161.                 if (DEBUG) {
  162.                     Log.v(TencentUpload.TAG, “getTencentSign() Original:\n”
  163.                             + Original);
  164.                 }
  165.                 String SignData = Base64Util.encode(all);
  166.                 if (DEBUG) {
  167.                     Log.v(TencentUpload.TAG, “getTencentSign() SignData:\n”
  168.                             + SignData);
  169.                 }
  170.                 return SignData;
  171.             } catch (Exception e) {
  172.                 e.printStackTrace();
  173.             }
  174.             return “get sign failed”;
  175.         }
  176.     }
  177.     public static class TencentDownload {
  178.         private static final String TAG = “TencentDownload”;
  179.         private static TencentDownload mTencentDownload = null;
  180.         private static Downloader mDownloader = null;
  181.         public static TencentDownload initTencentDownload(Context context) {
  182.             if (mTencentDownload == null) {
  183.                 mTencentDownload = new TencentDownload();
  184.             }
  185.             if (mDownloader == null) {
  186.                 mDownloader = new Downloader(context,
  187.                         ParamPreference.TENCENT_COS_APPID,
  188.                         ParamPreference.TENCENT_COS_PERSISTENCEID);
  189.             }
  190.             return mTencentDownload;
  191.         }
  192.         public void startDownLoad(String downloadUrl) {
  193.             mDownloader.download(downloadUrl,
  194.                     new Downloader.DownloadListener() {
  195.                         @Override
  196.                         public void onDownloadSucceed(final String url,
  197.                                 final DownloadResult result) {
  198.                             String file_path = result.getPath();
  199.                             Bitmap bmp = decodeSampledBitmap(file_path, 2);
  200.                             Log.v(TAG, “下载完成:” + bmp.toString());
  201.                         }
  202.                         @Override
  203.                         public void onDownloadProgress(String url,
  204.                                 long totalSize, final float progress) {
  205.                             long nProgress = (int) (progress * 100);
  206.                             Log.i(TAG, “下载进度: “ + nProgress + “%”);
  207.                         }
  208.                         @Override
  209.                         public void onDownloadFailed(String url,
  210.                                 DownloadResult result) {
  211.                         }
  212.                         @Override
  213.                         public void onDownloadCanceled(String url) {
  214.                         }
  215.                     });
  216.         }
  217.     }
  218.     public static Bitmap decodeSampledBitmap(String path, int sample) {
  219.         final BitmapFactory.Options options = new BitmapFactory.Options();
  220.         options.inJustDecodeBounds = true;
  221.         options.inSampleSize = sample;
  222.         options.inJustDecodeBounds = false;
  223.         return BitmapFactory.decodeFile(path, options);
  224.     }
  225. }

工具类代码里面附带了上传文件和下载文件的函数,以及打印日志,日志调试开启,将 DEBUG 设为 true 即可,DEBUG 为 true 默认开启下载之前上传成功的哪一个文件,文件上传默认的是覆盖模式,即出现同名的文件执行覆盖操作

工具类函数解析:

new FileUploadTask(ParamPreference.TENCENT_COS_BUCKET, loacFilePath, “/”+ filename, “”, false, new IUploadTaskListener()…);

ParamPreference.TENCENT_COS_BUCKET 为你的 bucket 名称

loacFilePath 为你的需要上传的文件的绝对路径

“/”+ filename 为你需要上传文件的相对路径 如:/test.png

第四个参数为空

第五个为回调接口实例

至此关于腾讯存储对象COS的使用和加密签名校验等就分享完毕了,谢谢大家的观看!