Vue2.0利用vue-resource上传文件到七牛的实例代码


Posted in Javascript onJuly 28, 2017

本文介绍了Vue2.0利用vue-resource上传文件到七牛,分享给大家,希望对大家有帮助

关于上传,总是有很多可以说道的。

16年底,公司项目番茄表单的前端部分,开始了从传统的jquery到vue 2.0的彻底重构。但是上传部分,无论是之前的传统版本,还是Vue新版本,都是在使用着FileAPI这款优秀的开源库,只是进行了简单的directive化。为什么呢?因为兼容性。没办法,公司项目不等同于个人项目,必须要考虑大多数浏览器。否则,上传部分完全可以利用Vue-Resource以及FormData来抛开对FileAPI的依赖。这让我深感遗憾,幸好这个简单的遗憾在个人博客Vue化重构的时候得以弥补。

上传流程

Vue2.0利用vue-resource上传文件到七牛的实例代码

图不重要看文字

input[type="file"] change事件触发后,先去(如果是图片,可以同时通过FileReader以及readAsDataURL将图片预览在页面上)后台请求七牛的上传token,将拿到的token和key以及通过change传递过来的files一起append到formData中。然后将formData通过post传递给七牛,七牛在处理后将返回真正的文件地址

获取token

const qiniu = require('qiniu')
const crypto = require('crypto')
const Config = require('qiniu-config')

exports.token = function*() {
  //构建一个保存文件名
  //这里没有处理文件后缀,需要自己传递过来,然后在这里处理加在key上,非必须
  const key = crypto.createHash('md5').update(((new Date()) * 1 + Math.floor(Math.random() * 10).toString())).digest('hex')
  //Config 七牛的秘钥等配置
  const [ACCESS_KEY, SECRET_KEY, BUCKET] = [Config.accessKey, Config.secretKey, Config.bucket] 
  qiniu.conf.ACCESS_KEY = ACCESS_KEY
  qiniu.conf.SECRET_KEY = SECRET_KEY
  const upToken = new qiniu.rs.PutPolicy(BUCKET + ":" + key)
  try {
    const token = upToken.token()
    return this.body = {
      key: key,
      token: token
    }
  } catch (e) {
    // throw error
  }
}

//假设api 地址是 /api/token

上传组件 upload.vue

<template>
  <label class="mo-upload">
    <input type="file" :accept="accepts" @change="upload">
    <slot></slot>
  </label>
</template>
<style lang="scss">
  .mo-upload {
    display: inline-block;
    position: relative;
    margin-bottom: 0;
    input[type="file"] {
      display: none;
    }
    .mo-upload--label {
      display: inline-block;
      position: relative;
    }
  }
</style>
<script>
  export default {
    name : 'MoUpload',
    props : {
      accepts : { //允许的上传类型
        type : String,
        default : 'image/jpeg,image/jpg,image/png,image/gif'
      },
      flag : [String, Number], //当前上传标识,以便于在同一个监听函数中区分不同的上传域
      maxSize : {
        type : Number,
        default : 0 //上传大小限制
      }, 
    },
    methods: {
      upload (event) {
        let file = event.target.files[0]
        const self = this
        const flag = this.flag
        if (file) {
          if (this.maxSize) {
            //todo filter file
          }
          //filter file, 文件大小,类型等过滤
          //如果是图片文件
          // const reader = new FileReader()
          // const imageUrl = reader.readAsDataURL(file)
          // img.src = imageUrl //在预览区域插入图片

          const formData = new FormData()
          formData.append('file', file)
          
          //获取token
          this.$http.get(`/api/token/`)
          .then(response => {
            const result = response.body
            formData.append('token', result.token)
            formData.append('key', result.key)
            //提交给七牛处理
            self.$http.post('https://up.qbox.me/', formData, {
              progress(event) {
                //传递给父组件的progress方法
                self.$emit('progress', parseFloat(event.loaded / event.total * 100), flag) 
              }
            })
            .then(response => {
              const result = response.body
              if (result.hash && result.key) {
                //传递给父组件的complete方法
                self.$emit('complete', 200 , result, flag)
                //让当前target可以重新选择
                event.target.value = null
              } else {
                self.$emit('complete', 500, result, flag)
              }
            }, error => self.$emit('complete', 500, error.message), flag)
          })
        }
      }
    }
  }
</script>

父组件调用

<template>
  <section>
    ...
    <figure class="upload-preview">
      <img :src="thumbnail" v-if="thumbnail"/>
    </figure>
    <mo-upload flag="'thumbnail'" @complete="uploadComplete" @progress="uploadProgress">
      <a>选择图片文件<i class="progress" :style="{width:progress + '%'}"></i></a>
    </mo-upload>
    ...
  </section>
</template>
<script>
  import MoUpload from 'upload'
  export default {
    components : {
      MoUpload,
    },
    data () {
      return {
        thumbnail : null,
        progress : 0 //上传进度
      }
    },
    methods : {
      uploadProgress (progress, flag) {
        //这里可以通过回调的flag对不同上传域做处理
        this.progress = progress < 100 ? progress : 0;
      },
      uploadComplete(status, result, flag) {
        if (status == 200) { //
          this.thumbnail = `domain.com/${result.key}` //七牛域名 + 返回的key 组成文件url
        } else {
          //失败处理
        }
      },
    }
  }
</script>

小结

相比于FILEApi 或者其他上传组件,这种方法代码量最小。但是缺点也是显而易见的,大量html5 API的使用,势必会回到兼容性这个老大难上来,慎重的选择性使用吧‘

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

Javascript 相关文章推荐
用函数式编程技术编写优美的 JavaScript_ibm
May 16 Javascript
js继承 Base类的源码解析
Dec 30 Javascript
jQuery 事件队列调整方法
Sep 18 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
jquery拖动插件(jquery.drag)使用介绍
Jun 18 Javascript
javascript计时器事件使用详解
Jan 07 Javascript
jquery实现弹出层登录和全屏层注册特效
Aug 28 Javascript
详解vue数据渲染出现闪烁问题
Jun 29 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
Oct 26 Javascript
微信小程序的线程架构【推荐】
May 14 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
Dec 24 Javascript
vue使用vue-cli快速创建工程
Jul 28 #Javascript
用JS实现简单的登录验证功能
Jul 28 #Javascript
基于JavaScript实现图片连播和联级菜单实例代码
Jul 28 #Javascript
vue中七牛插件使用的实例代码
Jul 28 #Javascript
Vue.js中的图片引用路径的方式
Jul 28 #Javascript
将 vue 生成的 js 上传到七牛的实例
Jul 28 #Javascript
详解Vue2中组件间通信的解决全方案
Jul 28 #Javascript
You might like
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
python 串行执行和并行执行实例
2020/04/30 Python
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
中秋节礼品促销方案
2014/02/02 职场文书
高中军训感言600字
2014/03/11 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
七夕情人节问候语
2015/11/11 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js