全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

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

上传流程

图不重要看文字

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的使用,势必会回到兼容性这个老大难上来,慎重的选择性使用吧‘

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


# vue2.0  # 七牛上传图片  # vue七牛云上传图片  # vue上传图片到七牛  # Vue封装一个简单轻量的上传文件组件的示例  # vue使用axios上传文件(FormData)的方法  # axios+Vue实现上传文件显示进度功能  # vue使用el-upload上传文件及Feign服务间传递文件的方法  # vue.js异步上传文件前后端实现代码  # vuejs+element-ui+laravel5.4上传文件的示例代码  # Vue axios 中提交表单数据(含上传文件)  # Vue开发之封装上传文件组件与用法示例  # 上传  # 重构  # 是在  # 在这里  # 老大难  # 有很多  # 这款  # 没办法  # 可以通过  # 给大家  # 要看  # 什么呢  # 后将  # 显而易见  # 先去  # 表单  # 或者其他  # 这让  # 可以利用  # 新版本 


相关文章: 如何通过老薛主机一键快速建站?  建站之星如何实现五合一智能建站与营销推广?  焦点电影公司作品,电影焦点结局是什么?  建站VPS选购需注意哪些关键参数?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  如何快速启动建站代理加盟业务?  如何高效配置IIS服务器搭建网站?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星后台管理:高效配置与模板优化提升用户体验  清除minerd进程的简单方法  如何快速搭建高效香港服务器网站?  高防服务器租用指南:配置选择与快速部署攻略  定制建站流程解析:需求评估与SEO优化功能开发指南  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  ,怎么用自己头像做动态表情包?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何选择香港主机高效搭建外贸独立站?  如何通过西部数码建站助手快速创建专业网站?  建站之星后台管理系统如何操作?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  网站制作员失业,怎样查看自己网站的注册者?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何快速生成ASP一键建站模板并优化安全性?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何选购建站域名与空间?自助平台全解析  建站主机默认首页配置指南:核心功能与访问路径优化  如何制作算命网站,怎么注册算命网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  教程网站设计制作软件,怎么创建自己的一个网站?  建站主机与服务器功能差异如何区分?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  建站VPS能否同时实现高效与安全翻墙?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  深入理解Android中的xmlns:tools属性  青浦网站制作公司有哪些,苹果官网发货地是哪里?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在万网自助建站中设置域名及备案?  建站之星安装需要哪些步骤及注意事项?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  MySQL查询结果复制到新表的方法(更新、插入)  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在自有机房高效搭建专业网站?  存储型VPS适合搭建中小型网站吗?  如何快速上传建站程序避免常见错误?  制作农业网站的软件,比较好的农业网站推荐一下? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。