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

  因为最近的项目有两台机器一直处于负载均衡状态,因此上传的资源都不能直接传到服务器后台上,而是经过云平台进行交互,因此难免就涉及到不少上传,下载的接口,因此专门记录一下这一系列的过程。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文件才行。

相关文章
相关标签/搜索