因为最近的项目有两台机器一直处于负载均衡状态,因此上传的资源都不能直接传到服务器后台上,而是经过云平台进行交互,因此难免就涉及到不少上传,下载的接口,因此专门记录一下这一系列的过程。php
首先要把腾讯云前端和后端的sdk加入到项目中,JS的sdk地址为https://github.com/tencentyun/cos-js-sdk/tree/master/sdk,PHP的sdk地址为https://github.com/tencentyun/cos-php-sdk(要包括Sign.php由于每次发请求都要传送签名进行验证)同时为了保证上传文件的惟一性,因此会用到对整个文件内容进行md5处理的js,其位置为https://github.com/forsigner/browser-md5-file/tree/master/dist,而且也简单的讲到其使用方法:前端
如今简单的介绍一下其上传和下载功能(前提是项目都已经成功的引入上述文件,具体其余的功能如建立文件夹,删除文件夹等功能能够参考腾讯云存储的官方文档https://www.qcloud.com/doc/product/430/5946)。git
1.上传:github
首先我在前端页面建立一个<input type='file'>类型的输入,数据库
在JS里则是json
var bucketName = '你的腾讯云Bucket名称'; var cos = new CosCloud('你的腾讯云app_id');//实例化一个cos对象
var params={}; 表单提交时 { var pic = $('#img_url').prop('files');//获取上传的文件信息
browserMD5File(pic[0], function (err, md5) //获取文件的md5
{ var remotePath = '/image/' + md5 + "." + getSuffix(pic[0]['name']);//要上传的路径
cos.out_uploadFile(function(result)//成功回调
{ params['img_url'] = $.parseJSON(result).data.access_url;//腾讯云的地址赋给这个字段更新到数据库
}, function (result)//失败回调
{ alert("上传失败!"); }, bucketName, remotePath, pic[0], 0); }); } //获取文件的后缀名
function getSuffix(filename) { var names = filename.split('.'); return names[names.length - 1]; }
这样就把腾讯云回调的路径传给了params里的字段传到后端进行查数据库处理,为了更好地处理,官方建议把成功的回调和失败的回调单独写成函数处理调用,bootstrap
这样相对来讲修改方便,推荐一下。后端
2.下载则通常来讲是后端下载,直接访问到文件的资源就能够下载了,这个用原生的php处理均可以,在php里引入对应的sdkapi
$cdn_url='你的腾讯云资源的绝对路径'; $filename=basename($cdn_url); //获取文件名
$myFilePath='/app/public/'.$filename; //获取本地文件路径
set_time_limit (24 * 60 * 60); $cdnFile = fopen ($cdn_url, "rb"); if ($cdnFile) { $myFile= fopen($myFilePath, "wb"); if ($myFile) { while (!feof($cdnFile)) { fwrite($myFile, fread($cdnFile,1024 * 8),1024 * 8); } } fclose($cdnFile); if($myFile) { fclose($myFile); } }
这样就在后端把腾讯云的文件下载下来了,主要是借助于php的fopen函数。跨域
3.获取上传进度:
在网页定义一个进度条,引用自bootstrap的样式
这个只要设置一个定时器定时修改progress-bar的width便可显示加载的进度。前端JS获取上传进度的接口以下,在调试时一直报错(后来发现是由于浏览器跨域了,因此就把Bucket进行跨域设置就把接口调通了,不过直接用后端发请求是不会出现这个问题的),因而
就用php端直接发一样的请求:
$bucketName=‘你的Bucket名称’; $remotePath=‘腾讯云资源的路径’; $result=Cosapi::stat($bucketName, $remotePath);//发请求返回结果return response()->json(['filelen'=>$result['data']['filelen']]);
前端在定时把后端传过去的(这个值/文件长度)*100+“%”设置为进度条的宽度便可。(吐槽一句,从后端发请求简直容易太多,可是这个接口的回调有问题,进度条的进度从0%忽然变到100%,问了腾讯云说是接口就是这样,难道接口里再获取一个进度很难吗???)
总的来讲,其SDK的方法也很常见,基本都是增删改查(文件、目录)的功能,只要根据本身的需求调用对应的sdk方法便可,前提是js和php端都得先引入sdk文件才行。