php文件上传 腾讯云,基于腾讯云的文件上传,下载,获取进度接口以及md5值的获取...

基于腾讯云的文件上传,下载,获取进度接口以及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,并且也简单的讲到其使用方法:

20200618023334-5eead27ead5fc.png

现在简单的介绍一下其上传和下载功能(前提是项目都已经成功的引入上述文件,具体其他的功能如创建文件夹,删除文件夹等功能可以参考腾讯云存储的官方文档https://www.qcloud.com/doc/product/430/5946)。

1.上传:

首先我在前端页面创建一个类型的输入,

20200618023336-5eead2805cd2b.png

在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);

});

}//获取文件的后缀名

functiongetSuffix(filename)

{var names = filename.split('.');return names[names.length - 1];

}

这样就把腾讯云回调的路径传给了params里的字段传到后端进行查数据库处理,为了更好地处理,官方建议把成功的回调和失败的回调单独写成函数处理调用,

20200618023337-5eead281cb34b.png

这样相对来说修改方便,推荐一下。

2.下载则一般来说是后端下载,直接访问到文件的资源就可以下载了,这个用原生的php处理都可以,在php里引入对应的sdk

20200618023339-5eead283a70f9.png

$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的样式

20200618023340-5eead28489669.png

这个只要设置一个定时器定时修改progress-bar的width即可显示加载的进度。前端JS获取上传进度的接口如下,在调试时一直报错(后来发现是因为浏览器跨域了,所以就把Bucket进行跨域设置就把接口调通了,不过直接用后端发请求是不会出现这个问题的),于是

20200618023342-5eead286a26ad.png

就用php端直接发同样的请求:

$bucketName=‘你的Bucket名称’;$remotePath=‘腾讯云资源的路径’;$result=Cosapi::stat($bucketName, $remotePath);//发请求返回结果return response()->json(['filelen'=>$result['data']['filelen']]);

前端在定时把后端传过去的(这个值/文件长度)*100+“%”设置为进度条的宽度即可。(吐槽一句,从后端发请求简直容易太多,但是这个接口的回调有问题,进度条的进度从0%突然变到100%,问了腾讯云说是接口就是这样,难道接口里再获取一个进度很难吗???)

总的来说,其SDK的方法也很常见,基本都是增删改查(文件、目录)的功能,只要根据自己的需求调用对应的sdk方法即可,前提是js和php端都得先引入sdk文件才行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值