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

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

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




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


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




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


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

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

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

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



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

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

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

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


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

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

返回的String就是签名的url


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

public static int upLoadFileByFile(String singnedurl,String fileName)  throws Exception{
		URL url=new URL(singnedurl);
		FileInputStream fileInputStream=new FileInputStream(fileName);
		  int responseCode = 0;
		try {
		    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		    connection.setDoOutput(true);
		    connection.setRequestMethod("PUT");
		    DataOutputStream out = new DataOutputStream(connection.getOutputStream());
		    
		    //out=new OutputStreamWriter(new FileOutputStream(new File("c:/qqq.zip")));
		    // 写入要上传的数据 
		    byte buff[]= new byte[1024];
		    int len;
		    while( (len=fileInputStream.read(buff))!=-1  ) {
		    	out.write(buff, 0, len);
		    }
		    out.close();
		    responseCode = connection.getResponseCode();
		    System.out.println("Service returned response code " + responseCode);
		} catch (ProtocolException e) {
		    e.printStackTrace();
		} catch (IOException e) {
		    e.printStackTrace();
		}
		
		return responseCode;
	}

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


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

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

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








  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值