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 相关文章推荐
jquery 字符串切割函数substring的用法说明
Feb 11 Javascript
常用的几段javascript代码分享
Mar 25 Javascript
自己动手写的jquery分页控件(非常简单实用)
Oct 28 Javascript
AngularJS进行性能调优的7个建议
Dec 28 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
如何使用Bootstrap创建表单
Mar 29 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
vue实现app页面切换动画效果实例
May 23 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 Javascript
web前端vue实现插值文本和输出原始html
Jan 19 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
Jul 11 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 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基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
JavaScript DOM基础
2015/04/13 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
Vue程序调试的方法
2019/06/17 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
快速解决element的autofocus失效问题
2020/09/08 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
Python rstrip()方法实例详解
2018/11/11 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
Python正则表达式学习小例子
2020/03/03 Python
python中常见错误及解决方法
2020/06/21 Python
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
yy结婚证婚词
2014/01/10 职场文书
客服部工作职责范本
2014/02/14 职场文书
仓库主管岗位职责
2014/03/02 职场文书
药学职务聘任书
2014/03/29 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
人口与计划生育责任书
2015/05/09 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
导游词之山西关帝庙
2019/11/01 职场文书