本文介绍了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快速搭建个人网站?
建站168自助建站系统:快速模板定制与SEO优化指南
定制建站是什么?如何实现个性化需求?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何选择高效稳定的ISP建站解决方案?
javascript基本数据类型及类型检测常用方法小结
开封网站制作公司,网络用语开封是什么意思?
广平建站公司哪家专业可靠?如何选择?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
成都响应式网站开发,dw怎么把手机适应页面变成网页?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
建站之星导航菜单设置与功能模块配置全攻略
如何在建站之星网店版论坛获取技术支持?
如何快速上传建站程序避免常见错误?
制作表格网站有哪些,线上表格怎么弄?
,网页ppt怎么弄成自己的ppt?
企业微网站怎么做,公司网站和公众号有什么区别?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
建站主机如何安装配置?新手必看操作指南
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何在IIS服务器上快速部署高效网站?
用v-html解决Vue.js渲染中html标签不被解析的问题
网站制作需要会哪些技术,建立一个网站要花费多少?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何在景安云服务器上绑定域名并配置虚拟主机?
如何在Windows服务器上快速搭建网站?
江苏网站制作公司有哪些,江苏书法考级官方网站?
海南网站制作公司有哪些,海口网是哪家的?
制作网站的基本流程,设计网站的软件是什么?
如何在Windows环境下新建FTP站点并设置权限?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
建站之星官网登录失败?如何快速解决?
如何零成本快速生成个人自助网站?
定制建站价位费用解析与套餐推荐全攻略
javascript中对象的定义、使用以及对象和原型链操作小结
制作旅游网站html,怎样注册旅游网站?
教学论文网站制作软件有哪些,写论文用什么软件
?
已有域名和空间如何搭建网站?
三星网站视频制作教程下载,三星w23网页如何全屏?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
建站之星多图banner生成与模板自定义指南
淘宝制作网站有哪些,淘宝网官网主页?
如何高效完成自助建站业务培训?
*请认真填写需求信息,我们会在24小时内与您取得联系。