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 相关文章推荐
js几个验证函数代码
Mar 25 Javascript
基于jquery的loading效果实现代码
Nov 05 Javascript
jQuery基础框架浅入剖析
Dec 27 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
JavaScript给url网址进行encode编码的方法
Mar 18 Javascript
JavaScript中String.match()方法的使用详解
Jun 06 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
Mar 19 Javascript
javaScript中的原型解析【推荐】
May 05 Javascript
Javascript vue.js表格分页,ajax异步加载数据
Oct 24 Javascript
详谈js原型继承的一些问题
Sep 06 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
Aug 25 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
Sep 20 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中使用GD库创建圆形饼图的例子
2014/11/19 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
php中关于换行的实例写法
2019/09/26 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
用JavaScript实现对话框的教程
2015/06/04 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
Python中GIL的使用详解
2018/10/03 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python开头的coding设置方法
2019/08/08 Python
python 多进程队列数据处理详解
2019/12/23 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
七一讲话心得体会
2014/09/05 职场文书
研究生导师推荐信
2014/09/06 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
大学生实习证明
2015/06/16 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS