腾讯云Cos获取签名并通过签名上传文件

朱雀 2022-05-25 06:53 1271阅读 0赞

项目中有个需求,需要把文件传到腾讯云cos存储,还没开始前先去腾讯云上面,赶紧申请一个试试看,之前用过微软云blob存储,整体而言都差不多,就是一个文件夹吧,通过api把文件传上去就ok了.

先去申请cos ,然后申请一个桶,如下图:

20180510175351311

这个桶 的概念 类似于计算机上面的 磁盘

点击进去后就可以看到 文件 和文件夹,这些都是测试的时候上传的

20180510175514371

文件既可以通过这个web页面上传,也可以通过api 上传,

当前肯定是用api 上传了 ,赶紧看了一下代码

  1. //1 初始化用户身份信息(secretId, secretKey)
  2. COSCredentials cred = new BasicCOSCredentials("", "");
  3. // 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
  4. ClientConfig clientConfig = new ClientConfig(new Region("ap-shanghai"));
  5. // 3 生成cos客户端
  6. COSClient cosclient = new COSClient(cred, clientConfig);
  7. // bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
  8. String bucketName = "test-1251965632";
  9. File localFile = new File("C:\\Users\\Administrator\\Desktop\\这个是通过API测试的上传的文件.txt");
  10. // 指定要上传到 COS 上的路径
  11. String key = "/upload_single_demo.txt";
  12. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
  13. PutObjectResult putObjectResult = cosclient.putObject(putObjectRequest);
  14. cosclient.shutdown();

短短几行代码一跑,进入web管理界面,就可以看到文件顺利的上传上去了.

可以看到这个代码中有两个参数 一个是secretId,一个是secretKey,只有得到这两个才能调用api上传.

然后等到真正项目交接的时候就变了,对方直接甩给我一个签名的网址让我去上传文件.

为什么不把secretId,secretKey给我了?对方说为了安全考虑,只能去跟他申请签名的url,然后根据签名的url上传文件

问对方有没有签名url上传的示例代码,对方说没有,这个就很尴尬了,不得已还去研究怎么生成签名url的文档,腾讯云cos的文档写的也比较的乱,相当的烦,后来忍不了提了一个工单,发现其实很简单.根本不要自己去搞什么签名.都是有现成的.

能够开心的敲代码,就不要痛苦的敲代码.

首先是腾讯云cos 的持有者,他要为了安全考虑不对外提供secretId,secretKey,而是生成签名的url,这个不需要自己去搞,头疼,其实腾讯云cos已经帮你ok了,直接用代码就可以生成签名url

  1. // 1 初始化用户身份信息(secretId, secretKey)
  2. COSCredentials cred = new BasicCOSCredentials("", "");
  3. // 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
  4. ClientConfig clientConfig = new ClientConfig(new Region("ap-shanghai"));
  5. // 3 生成 cos 客户端
  6. COSClient cosclient = new COSClient(cred, clientConfig);
  7. // bucket名需包含appid
  8. String bucketName = "test-1251965632";
  9. String key = "123.zip";
  10. Date expirationTime = new Date(System.currentTimeMillis() + 30 * 60 * 1000);
  11. // 生成预签名上传 URL
  12. URL url = cosclient.generatePresignedUrl(bucketName, key, expirationTime, HttpMethodName.PUT);
  13. url.toString();

返回的String就是签名的url

而对于开发者而言,他们拿到url怎么上传文件了?一开始我就卡在这里,我在想,是不是要调用腾讯云cos的某个upload方法,后来发现其实就是一个http put请求就ok了.没错,就是这么的简单.

  1. public static int upLoadFileByFile(String singnedurl,String fileName) throws Exception{
  2. URL url=new URL(singnedurl);
  3. FileInputStream fileInputStream=new FileInputStream(fileName);
  4. int responseCode = 0;
  5. try {
  6. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  7. connection.setDoOutput(true);
  8. connection.setRequestMethod("PUT");
  9. DataOutputStream out = new DataOutputStream(connection.getOutputStream());
  10. //out=new OutputStreamWriter(new FileOutputStream(new File("c:/qqq.zip")));
  11. // 写入要上传的数据
  12. byte buff[]= new byte[1024];
  13. int len;
  14. while( (len=fileInputStream.read(buff))!=-1 ) {
  15. out.write(buff, 0, len);
  16. }
  17. out.close();
  18. responseCode = connection.getResponseCode();
  19. System.out.println("Service returned response code " + responseCode);
  20. } catch (ProtocolException e) {
  21. e.printStackTrace();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. return responseCode;
  26. }

我把他封装成了1个函数,一个参数是签名的url,一个参数是文件的名字,运行这个函数就可以上传成功了.

腾讯云官方的示例文档用的是maven项目,需要用到很多的jar包,我都做了整理,可以点击下载,直接新建一个普通的java项目导入就可以.

下面是打包好的jar包下载地址:

https://download.csdn.net/download/a897180673/10406337

发表评论

表情:
评论列表 (有 0 条评论,1271人围观)

还没有评论,来说两句吧...

相关阅读

    相关 COS体验

    其实这篇文章本来是推荐COS的,写了一半发现COS的免费额度取消了,2019年之后的开通的用户免费6个月,老用户不受影响,这还让我怎么推荐啊?!写都写了,删掉岂不是白浪费时间?

    相关 备份数据COS

    一、方案背景 由于服务器上数据量越来越大,备份的数据会占用硬盘空间(虽说云硬盘可随时扩容,但是存在风险),定时将备份上传到COS。不仅节省服务器硬盘空间,也大大提高备份数据