七牛云中带前缀的路径斜杆是怎么写的_腾讯云COS对象存储预签名普通上传方式使用记录...

因自己有七牛云换腾讯云的冲动,毕竟重新绑身份证正反面我是有些抗拒的,So?自己动手丰衣足食,其实这里也没什么好说的,毕竟别人文档写得那么全了,但是觉得还是做下步骤记录。

腾讯云COS服务器java端SDK目前版本为V5。

需求:像七牛云一样,从服务器获取签名后从移动端上传文件,即不需要在移动端配置id与密匙,直接根据签名上传。

区别:七牛需要在移动端与服务端各自依赖七牛云SDK,腾讯云COS只需要在服务端依赖SDK,但是很明显,腾讯云在移动端要做的操作就会多些,毕竟没有SDK。

注意:这里忽略掉腾讯云各自单独配置SDK的情况,即每个平台独立配置id与密匙完成操作。这些在官方文档上可以很轻松的学习到。

本文与腾讯云java服务端SDK有关:

生成预签名链接

服务端采用SpringBoot或者SpringMVC均可,请随意发挥你的才能。@RequestMapping(value = {"/getCOSUploadToken"}, method = {RequestMethod.POST})

@ResponseBody

public BaseResp getCosUploadToken(@Param("fileName") String fileName) {

String secretId = "your accessKey";

String secretKey = "your secretKey";

// bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式

String bucketName = "buketName-Appid";

// 1 初始化用户身份信息(secretId, secretKey)

COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

// 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224

ClientConfig clientConfig = new ClientConfig(new Region("your region"));

// 3 生成cos客户端

COSClient cosclient = new COSClient(cred, clientConfig);

//设置过期时间 3分钟

Date expiredTime = new Date(System.currentTimeMillis() + 180L * 1000L);

// 要签名的 key, 生成的签名只能用于对应此 key 的上传 这里路径拼接为上传至COS的head文件夹中

String key = "/head/"+fileName;

URL sign = cosclient.generatePresignedUrl(bucketName, key, expiredTime, HttpMethodName.PUT);

System.out.println(sign);

BaseResp resp = new BaseResp();

resp.setStatus(0);

resp.setMessage("");

resp.setData(sign);

return resp;

}

生成预签名服务端就这么点内容,简单解释下,这里面需要填写的内容有:secretId、secretKey、bucketName、Region、前两个参数可以在你的云API密匙找到,bucketName即你需要使用的桶名,但是这里有一个要求就是需要在你的桶名后跟上-AppId,当然如果你的桶命名已经是{name}-{appid},则无需重复添加appid,appid也可以在“云API密匙中找到”,从上面代码可已看到该请求会携带一个参数fileName,为什么需要这样?因为签名一次只能对一个key进行签名,也就是对一个文件路径签名,如果你写死,则每次都会覆盖。

这里的策略是从移动端每次发送需要上传的文件名来进行签名,避免不同的文件会被覆盖。最后返回签名过的链接,注意:预签名完成返回的链接是完整的,即“http://xxxxxxxx.myqcloud.com/你的key?sigin=一串签名”

这个链接可以直接使用HTTP的PUT请求方式上传文件。

移动端使用:

首先你得获取到你想要上传的文件以及签名后的链接。这里使用Okhttp与RxJava结合的方式,方便切换线程和回调等/**

* 腾讯云COS预签名工具类

*/class UploadUtils {

/**

* uploadUrl put请求地址 也就是上面服务端返回的签名后的链接

* localPath 本地文件路径 你需要上传的文件路径 绝对路径 完整的

*/ fun put(uploadUrl: String, localPath: String): Observable {

//请求内容类型

val imageType = MediaType.parse("image/jpeg; charset=utf-8")

//获取文件名

val name = localPath.substring(localPath.lastIndexOf("/")+1, localPath.length)

val file = File(localPath)

val body = RequestBody.create(imageType, file)

//创建request

val request = Request.Builder()

.url(uploadUrl)

.put(body) //PUT方式

.build()

return Observable.create {

//设置各种Timeout 然后执行,该部分代码为异步,我在使用时调用了subscribeOn(Schedulers.io())

val response = OkHttpClient.Builder()

.connectTimeout(600, TimeUnit.SECONDS)

.readTimeout(200, TimeUnit.SECONDS)

.writeTimeout(600, TimeUnit.SECONDS)

.build()

.newCall(request)

.execute()

//这里的response是没有返回内容的,也就是说,上传后并不会直接给你远程链接,但是code会有,可以判断是否成功

//拼接上传至COS后的远程链接

val link = "${QCLOUD_SERVER_ADDRESS}head/$name"

it.onNext(link)

}

}

}

这里说下流程,就是使用PUT请求的方式,将文件通过服务器签名的链接上传即可,但是注意需要最后自己拼接远程链接。拼接方法,在你的对象存储中随便上传一个文件,然后点击文件信息,将类似域名“http://你的bucket名-你的appid.你的存储地区.myqcloud.com/”作为baseUrl也就是我上面的QCLOUD_SERVER_ADDRESS,然后拼上你在服务器端配置的key,我这里也是head文件夹+文件名。

调用时:UploadUtils().put(result, mLocalFileUrl).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())

.subscribe(object : Observer {

override fun onComplete() {}

override fun onSubscribe(d: Disposable) {}

override fun onNext(t: String) {

mRemoteFileUrl = t

//做你要做的 比如我这里是将其加载到某个控件

GlideUtils.loadUrlImage(this@UserInfoActivity, mRemoteFileUrl, mUserIconIv)

}

override fun onError(e: Throwable) {e.printStackTrace()}

})

以上,为所有的生成预签名方式以及简单上传使用内容。

生成签名(有问题)

生成签名与生成预签名区别在哪呢?区别在生成预签名会生成完整链接,而生成签名则只会生成后面sign=xxxx的那一串签名。且签名需要配合移动端SDK进行使用。根据文档描述来看,应该是需要接入CAM系统进行使用,这里未测试。

易用性和文档上来讲七牛毫无疑问更胜一筹,但是移动端想精简一些,可考虑腾讯云。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值