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 相关文章推荐
JS 动态获取节点代码innerHTML分析 [IE,FF]
Nov 30 Javascript
javascript动态加载三
Aug 22 Javascript
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
关于Jquery操作Cookie取值错误的解决方法
Aug 26 Javascript
JS实现将人民币金额转换为大写的示例代码
Feb 13 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
javascript事件绑定学习要点
Mar 09 Javascript
bootstrap table服务端实现分页效果
Aug 10 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 Javascript
细说webpack6 Babel的使用详解
Sep 26 Javascript
判断JavaScript中的两个变量是否相等的操作符
Dec 21 Javascript
小程序wx.getUserProfile接口的具体使用
Jun 02 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
php使用pack处理二进制文件的方法
2014/07/03 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
Vue组件实现触底判断
2019/06/26 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python实现远程调用MetaSploit的方法
2014/08/22 Python
Python引用模块和查找模块路径
2016/03/17 Python
学习python可以干什么
2019/02/26 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
浅析Python的命名空间与作用域
2020/11/25 Python
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
最新的大学生找工作自我评价
2013/09/29 职场文书
教师自荐信
2013/12/10 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
家长通知书家长评语
2014/04/17 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
如何Python使用re模块实现okenizer
2022/04/30 Python