js纯前端实现腾讯cos文件上传功能的示例代码


Posted in Javascript onMay 14, 2019

前言

在前端开发中文件上传是经常会遇到的,并且多数情况会使用第三方平台来存储文件,腾讯云cos是我们常用的。本篇文章就是带我从前端的角度实现腾讯云COS存储。本文参考了腾讯云COS开发文档 JavaScript SDK

步骤

安装腾讯云COS上传所需的sdk

下载cos-js-sdk-v5.min.js并引入index.html

监听文件上传组件

//监听文件变化
document.getElementById('file').onchange = function() {
          let file = this.files[0];
          let type = file.type
          //初始化文件上传
          initUploadObj(that, file.name, file, 'image', function(res) {
            if (res.success) {
              that.$message.success(res.msg)
            } else {
              that.$message.warning(res.msg)
            }
          })
        }

初始化文件上传对象(封装起来其他地方上传也可以用)

/**
 * 初始化上传文件对象
 * @param {object} Vue
 * @param {string} fileName 文件名
 * @param {object} file 上传的文件流及文件类型 名称相关信息
 * @param {Array} 允许上传的文件类型
 * @param {function} uploadStatusCallbalck
 * @return {function} 返回回调函数
 */
export const initUploadObj = function (Vue,fileName,file,type,uploadStatusCallbalck) {
 let fileInfo = {
  file_name: fileName,
  media_type: 2,
  media_sub_type: 0,
  size_of_bytes: 122,
  file_expired_type: 'permanent',
 };
 //前端做文件类型限制
 if(type == 'image'){
  type = ['.jpg','.gif','.jpeg','.bmp','.png']
 }
 if(type == 'excel'){
  type = ['.xlsx']
 }
 let fileType =file.name ? file.name.substring(file.name.lastIndexOf(".")).toLowerCase() : ''; 
 if (!!type && type.indexOf (fileType) < 0) {
  uploadStatusCallbalck ({success: false, msg: '请上传正确的'+type+'文件格式!'});
  return;
 }
 var cos = new COS ({
  getAuthorization: function (options, callback) {
   let singleInfo = Vue.$store.state.fileToken;
   callback ({
    TmpSecretId: singleInfo.tmpSecretId,
    TmpSecretKey: singleInfo.tmpSecretKey,
    XCosSecurityToken: singleInfo.sessionToken,
    ExpiredTime: singleInfo.expiredTime,
   });
  },
 });
 fileInfo.file_name = file.name;
 //获取文件上传密钥
 getFileToken (Vue, fileInfo, cos, file, uploadStatusCallbalck);
};

获取文件上传密钥(最好存在后端通过ajax请求获取,安全性较高)

function getFileToken (Vue, fileInfo, cos, file, uploadStatusCallbalck) {
 let url = process.env.VUE_APP_URL + '/file/secretid';
 if (!file) return;
 // 异步获取临时密钥
 axios
  .get (url)
  .then (function (res) {
   if (res.data.code == 100000) {
    //获取的临时秘钥存储在vuex中
    Vue.$store.commit ('UPDATE_FILE_INFO', res.data.data);
    uploadFile (cos, file, res.data.data, uploadStatusCallbalck);
   } else {
    uploadStatusCallbalck ({success: false, msg: '获取文件秘钥失败!'});
   }
  })
  .catch (function (err) {
   uploadStatusCallbalck ({success: false, msg: '获取文件秘钥接口出错!'});
  });
}

上传文件(调用相关api putObject来上传文件)

/**
 * @method uploadFile
 * @param {object} cos
 */
function uploadFile (cos, file, signInfo, callback) {
 cos.putObject (
  {
   Bucket: process.env.VUE_APP_BUCKET,
   Region: 'ap-shanghai',
   Key: signInfo.fileId,
   Body: file,
   onHashProgress: function (progressData) {
    console.log ('校验中', JSON.stringify (progressData));
   },
   onProgress: function (progressData) {
    console.log ('上传中', JSON.stringify (progressData));
   },
  },
  function (err, data) {
   if (err) {
    console.log (err);
    callback ({success: false, msg: '文件上传失败!'});
    return;
   }
   callback ({success: true, msg: '上传成功!', data: data, signInfo: signInfo});
  }
 );
}

总结

腾讯云cos文件上传实际是分为三步,本地表单处理文件流 => 根据文档获取相关参数 => 上传文件。

  • 第一步主要前端上传功能的处理,可以用来限制文件上传大小(不太准确,根据文件的字节流长度),文件上传类型(根据文件后缀名)。
  • 第二步的参数多数都是可以在cos账号后台拿到的。这块参数最好还是存储在后台比较安全。
  • 第三步上传我们只需要调用sdk相关接口传入参数即可。只要熟悉了这三个步骤,上传的大部分问题都能解决掉。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype Selector对象学习
Jul 23 Javascript
用json方式实现在 js 中建立一个map
May 02 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
Jun 08 Javascript
javascript中Date()函数在各浏览器中的显示效果
Jun 18 Javascript
基于Turn.js 实现翻书效果实例解析
Jun 20 Javascript
JavaScript基于对象去除数组重复项的方法
Oct 09 Javascript
JavaScript中localStorage对象存储方式实例分析
Jan 12 Javascript
js实现楼层导航功能
Feb 23 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
Feb 27 jQuery
Vue学习之组件用法实例详解
Jan 06 Javascript
Ajax异步刷新功能及简单案例
Nov 20 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 #Javascript
vue如何获取自定义元素属性参数值的方法
May 14 #Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
May 14 #Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 #Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
May 14 #Javascript
fastadmin中调用js的方法
May 14 #Javascript
vue+elementUI实现表单和图片上传及验证功能示例
May 14 #Javascript
You might like
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
详解angular中的作用域及继承
2017/05/31 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
Python中的super用法详解
2015/05/28 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
Python内存读写操作示例
2018/07/18 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Python判断telnet通不通的实例
2019/01/26 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Python底层封装实现方法详解
2020/01/22 Python
Django多个app urls配置代码实例
2020/11/26 Python
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
开工仪式主持词
2014/03/20 职场文书
班风口号
2014/06/18 职场文书
人事专员岗位说明书
2014/07/29 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL