基于腾讯云的文件上传,下载,获取进度接口以及md5值的获取
由于最近的项目有两台机器一直处于负载均衡状态,所以上传的资源都不能直接传到服务器后台上,而是通过云平台进行交互,所以不免就涉及到很多上传,下载的接口,所以专门记录一下这一系列的过程。
首先要把腾讯云前端和后端的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)。
1.上传:
首先我在前端页面创建一个<input type='file'>类型的输入,
在JS里则是
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里的字段传到后端进行查数据库处理,为了更好地处理,官方建议把成功的回调和失败的回调单独写成函数处理调用,
这样相对来说修改方便,推荐一下。
2.下载则一般来说是后端下载,直接访问到文件的资源就可以下载了,这个用原生的php处理都可以,在php里引入对应的sdk
$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文件才行。