• 基于腾讯云的文件上传,下载,获取进度接口以及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文件才行。

  • 相关阅读:
    如何在页面上输出html标签:符号实体【转】
    js sort方法根据数组中对象的某一个属性值进行排序【转】
    原生js判断某个元素是否有指定的class名的几种方法【转】
    js支持的编码转换方法【转】
    windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes 解决方案【转】
    PHP 生成随机数rand()和mt_rand()的区别【转】
    php中var关键字用法【转】
    2020软件工程个人作业06——软件工程实践总结作业
    旺宝的家——事后诸葛亮
    旺宝的家—冲刺总结
  • 原文地址:https://www.cnblogs.com/martianShu/p/6047121.html
Copyright © 2020-2023  润新知