node腾讯云对象存储 文件上传

对象存储 文件上传

# npm i qcloud-cos-sts --save

var STS = require('qcloud-cos-sts');
// 配置参数
var config = {
  secretId: 'AKIDb2D8mAI9j36sNbYEdlcCWZLq65nLbaIk',   //修改
  secretKey: 'C7l9G6ewxhBOL1QYQ1KM8droUu3vWtzo', //修改
  proxy: '',
  durationSeconds: 1800,

  // 放行判断相关参数
  bucket: 'yanxianfei-1307931282',  //修改
  region: 'ap-beijing',  //修改
  allowPrefix: '*', // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
  // 简单上传和分片,需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
  allowActions: [
      // 简单上传
      'name/cos:PutObject',
      'name/cos:PostObject',
      // 分片上传
      'name/cos:InitiateMultipartUpload',
      'name/cos:ListMultipartUploads',
      'name/cos:ListParts',
      'name/cos:UploadPart',
      'name/cos:CompleteMultipartUpload'
  ],
};

// 腾讯云生成临时秘钥

// 创建临时密钥服务
var app = express();
app.use(bodyParser.json());

// 支持跨域访问
app.all('*', function (req, res, next) {
  res.header('Content-Type', 'application/json');
  res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:88');
  res.header('Access-Control-Allow-Headers', 'origin,accept,content-type');
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By",' 3.2.1')
  res.header("Content-Type", "application/json;charset=utf-8");
  if (req.method.toUpperCase() === 'OPTIONS') {
      res.end();
  } else {
      next();
  }
});
// 临时密钥接口
app.all('/sts', function (req, res, next) {

  // TODO 这里根据自己业务需要做好放行判断

  // 获取临时密钥
  var shortBucketName = config.bucket.substr(0 , config.bucket.lastIndexOf('-'));
  var appId = config.bucket.substr(1 + config.bucket.lastIndexOf('-'));
  var policy = {
      'version': '2.0',
      'statement': [{
          'action': config.allowActions,
          'effect': 'allow',
          'principal': {'qcs': ['*']},
          'resource': [
              'qcs::cos:' + config.region + ':uid/' + appId + ':prefix//' + appId + '/' + shortBucketName + '/' + config.allowPrefix,
          ],
      }],
  };
  STS.getCredential({
      secretId: config.secretId,
      secretKey: config.secretKey,
      proxy: config.proxy,
      durationSeconds: config.durationSeconds,
      policy: policy,
  }, function (err, tempKeys) {
      var result = JSON.stringify(err || tempKeys) || '';
      res.send(result);
  });
});

# 请求/sts接口 返回秘钥
![image.png](https://upload-images.jianshu.io/upload_images/24202745-6c5b1dc035eca137.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

html 上传示例

<!DOCTYPE html>
<html>
<head>
    <TITLE> ZTREE DEMO - beforeCheck / onCheck</TITLE>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="./jquery.min.js"></script>
    <script src="./sdk/cos-js-sdk-v5.min.js"  charset="utf-8"></script>
    <script src="./md5.js"></script>
</head>
<body>
<button type="button" class="layui-btn" id="up_pic_btn">多图片上传</button>    
<input id="upload-file" type="file" title="上传图片" multiple style="display: none;" accept="image/*">
<script type="text/javascript">
     
     var cos = new COS({
            getAuthorization: function (options, callback) {
                // 异步获取临时密钥
                    $.ajax({
                        method: 'get',
                        url: 'http://localhost:4000/sts',
                        data: '',
                        dataType: 'json',
                        success: function (res) {
                            console.log(res,'8888888888888');
                            var credentials =res.credentials;
                            if (!res || !credentials) return console.error('credentials invalid');
                            callback({
                                TmpSecretId: credentials.tmpSecretId,
                                TmpSecretKey: credentials.tmpSecretKey,
                                SecurityToken: credentials.sessionToken,
                                // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
                                StartTime: res.startTime, // 时间戳,单位秒,如:1580000000
                                ExpiredTime: res.expiredTime, // 时间戳,单位秒,如:1580000900
                                ScopeLimit: true, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用
                            });
                          
                        }
                    });
             }
            });
            $('#up_pic_btn').on('click',function(){    
                $('#upload-file').click();
            });
  
            $('#upload-file').on('change',function(e){   
                var date = new Date();
                var year = date.getFullYear();
                var month = date.getMonth() + 1;
                var day = date.getDate();
                var h = date.getHours();
                var m = date.getMinutes()
                if (month < 10) { month = "0" + month;}
                if (day < 10) { day = "0" + day; }
                if (h < 10) {  h = "0" + h;}
                if (m < 10) {m = "0" + m;}
                time = year + month + day; 
                var s = date.getTime()
                var filesArr = this.files;
           
                let keytong = [];
                var yasuo = ''
                $.each(this.files, function (idx, it) { 
                    let size = it.size;
                    var _headers = {}
                    let img_name = it.name.split('.')[0]
                    let img_type = it.name.split('.')[1]
                    console.log(img_name+img_type);
                    if(parseFloat(size/1024/1024)> 1){ 
                        yasuo = 1;
                        _headers = {'Pic-Operations':'{"is_pic_info": 1, "rules": [{"fileid":"thumb_'+ s +hex_md5(img_name)+'.'+img_type +'", "rule": "imageMogr2/format/webp"}]}'}
                    }
                    let set_img_url =  time + '/' + s+hex_md5(img_name)+'.'+img_type;
                    console.log(set_img_url,'/set_img_urlset_img_url');
                    keytong.push({
                        Bucket: 'yanxianfei-1307931282', // Bucket 格式
                        Region: 'ap-beijing',     /* 存储桶所在地域,必须字段 */
                        Key: "upimages/"+set_img_url,
                        Body: it,
                        Headers:_headers,
                        onTaskReady: function(taskId) {
                            // console.log(taskId);
                        }
                    })
                    yasuo = '';
                });
                console.log(keytong,'keytongkeytongkeytongkeytong');
                cos.uploadFiles({
                    files: keytong,
                    SliceSize: 1024 * 1024 * 10,    /* 设置大于10MB采用分块上传 */
                    onProgress: function (info) {
                        var percent = parseInt(info.percent * 10000) / 100;
                        var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
                        console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
                    },
                    onFileFinish: function (err, data, options) {
                        console.log(data, + '上传' + (err ? '失败' : '完成'));
                        if(err){
                            // layer.msg('上传失败')
                            // layer.close(loading);
                            return false
                        }
                        let src = '';
                        src = data.Location; //原图
                        if(data.UploadResult){
                            src = data.UploadResult.ProcessResults.Object.Location; //压缩图
                        }
                    },
                }, function (err, result) {
                    console.log(result,'////99999999999999999999999999999999999999');
                });
        })
</script>
</body>
</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容