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中令人发指的valueOf方法介绍
Feb 22 Javascript
js获取某元素的class里面的css属性值代码
Jan 16 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 Javascript
node.js中的http.request.end方法使用说明
Dec 10 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
angular select 默认值设置方法
Jun 23 Javascript
Vue中的slot使用插槽分发内容的方法
Mar 01 Javascript
Next.js项目实战踩坑指南(笔记)
Nov 29 Javascript
微信小程序使用map组件实现解析经纬度功能示例
Jan 22 Javascript
详解Javascript实践中的命令模式
May 05 Javascript
JavaScript获取URL参数的方法分享
Apr 07 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中的加密功能
2006/10/09 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
Django URL传递参数的方法总结
2016/08/28 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
python提取log文件内容并画出图表
2019/07/08 Python
Python测试模块doctest使用解析
2019/08/10 Python
Python 读取位于包中的数据文件
2020/08/07 Python
您的网上新华书店:文轩网
2016/08/24 全球购物
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
师范应届生求职信
2013/11/15 职场文书
写给老师的表扬信
2014/01/21 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
文明演讲稿范文
2014/05/12 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
初三化学教学反思
2016/02/22 职场文书
新手初学Java网络编程
2021/07/07 Java/Android
基于docker安装zabbix的详细教程
2022/06/05 Servers