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 相关文章推荐
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
Apr 24 Javascript
有关JavaScript的10个怪癖和秘密分享
Aug 28 Javascript
选择器中含有空格在使用示例及注意事项
Jul 31 Javascript
js控制文本框只输入数字和小数点的方法
Mar 10 Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
Nov 25 Javascript
简单实现JS计算器功能
Dec 21 Javascript
js手机号批量滚动抽奖实现代码
Apr 17 Javascript
js防抖和节流的深入讲解
Dec 06 Javascript
Mint UI组件库CheckList使用及踩坑总结
Dec 20 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 Javascript
Nuxt使用Vuex的方法示例
Sep 06 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
Session保存到数据库的php类分享
2011/10/24 PHP
为你总结一些php信息函数
2015/10/21 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
angular.element方法汇总
2015/01/07 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
Django中url的反向查询的方法
2018/03/14 Python
python实现低通滤波器代码
2020/02/26 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
华为C++笔试题
2014/08/05 面试题
应届生妇产科护士求职信
2013/10/27 职场文书
小学毕业寄语大全
2014/04/03 职场文书
优质服务演讲稿
2014/05/14 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
销售代理协议书
2014/09/30 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
交通事故调解协议书
2015/05/20 职场文书