为了实现文件上传,我们需要使用Vue.js和Vant UI框架的一些组件和方法。具体步骤如下:
步骤一:安装所需依赖
首先,在项目目录下安装相应的依赖库。
npm install vant -S # 安装 vant ui 库
npm install vue-awesome-uploader -S # 安装 vue-awesome-uploader 库
步骤二:引入依赖
下一步,我们需要在main.js
文件中引入Vant UI和vue-awesome-uploader。
import Vue from 'vue'
import Vant from 'vant'
import 'vant/lib/index.css'
import VueAwesomeUploader from 'vue-awesome-uploader'
Vue.use(Vant)
Vue.use(VueAwesomeUploader)
步骤三:创建上传组件
在这一步中,我们需要创建一个由Vant UI按钮触发的文件上传窗口。这个窗口将展示上传的文件列表,并允许用户添加或删除文件。
<template>
<div>
<van-button type="primary" @click="handleUploadClick">
上传文件
</van-button>
<van-uploader
ref="uploader"
:max-count="5"
:preview-image="false"
:multiple="true"
:name="formData.name"
:accept="accepts"
:headers="headers"
:action="uploadUrl"
:data="formData"
@before-read="beforeRead"
@after-read="afterRead"
@begin="begin"
@success="success"
@fail="fail"
>
<template #upload">
<van-icon name="camera" size="24"/>
</template>
</van-uploader>
</div>
</template>
在上面的代码中,我们设置了上传组件的一些属性。其中,@click="handleUploadClick"
指定了用来触发文件上传窗口的按钮,ref="uploader"
指定引用名称为uploader
,@before-read
、@after-read
、@begin
、@success
和@fail
都是上传组件的事件,控制着上传过程中的各个阶段。
步骤四:编写上传处理逻辑
下一步,我们需要在上传组件中处理上传文件的逻辑。这个逻辑将在上传组件事件上设置的函数中编写,具体如下。
beforeRead 阶段
在这个阶段,我们需要检查文件大小和文件类型,以确保上传的文件符合规定。
beforeRead(file) {
const isJPG = file.type.indexOf('image') == 0
const isLt2M = file.size / 1024 / 1024 < 2
if (!isJPG) {
this.$toast('上传文件只能是图片格式!')
}
if (!isLt2M) {
this.$toast('上传文件大小不能超过 2MB!')
}
return isJPG && isLt2M
}
afterRead 阶段
在这个阶段,我们需要将上传的文件保存到数据中,并更新文件列表。
afterRead(files) {
this.files = this.files.concat(files)
if (this.files.length >= this.maxCount) {
this.$refs.uploader.inputElement.disabled = true
}
}
begin、success 和 fail 阶段
在这些阶段中,我们需要向服务器发送上传请求,根据上传的结果,做出相应的处理。
begin({ file, fileList }) {
this.$emit('begin', { file, fileList })
},
success(response, file, fileList) {
file.url = response.data.url
file.id = response.data.id
this.$emit('success', { response, file, fileList })
},
fail(error, file, fileList) {
this.$emit('fail', { error, file, fileList })
}
步骤五:实现删除功能
最后一步,我们需要为文件上传窗口添加删除单个文件和删除所有文件的功能。
<template>
<div>
<van-button type="primary" @click="handleUploadClick">
上传文件
</van-button>
<van-uploader
ref="uploader"
:max-count="5"
:preview-image="false"
:multiple="true"
:name="formData.name"
:accept="accepts"
:headers="headers"
:action="uploadUrl"
:data="formData"
@before-read="beforeRead"
@after-read="afterRead"
@begin="begin"
@success="success"
@fail="fail"
>
<template #upload">
<van-icon name="camera" size="24"/>
</template>
</van-uploader>
<van-popup v-model="showDeletePopup" position="bottom" :style="{ height: '160px' }">
<van-list style="margin-bottom: -10px;">
<van-list-item @click="deleteFileHandler(2)">删除选中文件</van-list-item>
<van-list-item @click="deleteFileHandler(1)">删除所有文件</van-list-item>
<van-list-item @click="() => showDeletePopup = false">取消</van-list-item>
</van-list>
</van-popup>
<van-dialog v-model="showDeleteTip" title="删除确认" :confirm-button-text="'是的,我要删除' + deleteText" :cancel-button-text="cancelText" confirm-button-color="#f00">
<template #content>
{{ deleteText }}个文件,确定删除吗?
</template>
</van-dialog>
</div>
</template>
<script>
export default {
data() {
return {
files: [], // 上传的文件列表
maxCount: 5, // 最大上传数量
accepts: '', // 文件类型限制
headers: {}, // HTTP头部
formData: {}, // 附带的表单数据
uploadUrl: '', // 上传的地址
showDeletePopup: false, // 是否展示删除选中的文件弹窗
showDeleteTip: false, // 是否展示删除确认对话框
deleteIndexList: [], // 选中的文件索引列表
}
},
methods: {
// 处理上传点击事件
handleUploadClick() {
this.$refs.uploader.inputElement.click()
},
// 处理删除选中的文件事件
deleteFileHandler(type) {
if (type === 1) {
this.showDeleteTip = true
return
}
this.deleteIndexList.forEach((item) => {
this.files.splice(item, 1)
})
this.$refs.uploader.inputElement.disabled = false
this.showDeletePopup = false
},
// 删除所有文件
deleteAllFiles() {
this.files = []
this.$refs.uploader.inputElement.disabled = false
this.showDeleteTip = false
},
// beforeRead
beforeRead(file) {
const isJPG = file.type.indexOf('image') == 0
const isLt2M = file.size / 1024 / 1024 < 2
if (!isJPG) {
this.$toast('上传文件只能是图片格式!')
}
if (!isLt2M) {
this.$toast('上传文件大小不能超过 2MB!')
}
return isJPG && isLt2M
},
// afterRead
afterRead(files) {
this.files = this.files.concat(files)
if (this.files.length >= this.maxCount) {
this.$refs.uploader.inputElement.disabled = true
}
},
// begin
begin({ file, fileList }) {
this.$emit('begin', { file, fileList })
},
// success
success(response, file, fileList) {
file.url = response.data.url
file.id = response.data.id
this.$emit('success', { response, file, fileList })
},
// fail
fail(error, file, fileList) {
this.$emit('fail', { error, file, fileList })
}
},
computed: {
deleteText() {
return this.deleteIndexList.length
},
cancelText() {
return '取消(' + (this.files.length - this.deleteIndexList.length) + ')'
}
}
}
</script>
在上面的代码中,我们已经实现了删除单个文件和删除所有文件的功能。其中,deleteFileHandler
函数处理删除操作,deleteAllFiles
函数实现删除所有文件操作。
示例说明
示例1:上传单个文件
在这个示例中,我们创建了一个上传单个文件的组件。
<template>
<div>
<van-button type="primary" @click="handleUploadClick">
上传文件
</van-button>
<van-uploader
ref="uploader"
:max-count="1"
:name="formData.name"
:accept="accepts"
:headers="headers"
:action="uploadUrl"
:data="formData"
@before-read="beforeRead"
@after-read="afterRead"
@begin="begin"
@success="success"
@fail="fail"
>
</van-uploader>
</div>
</template>
<script>
export default {
data() {
return {
maxCount: 1, // 最大上传数量
accepts: '', // 文件类型限制
headers: {}, // HTTP头部
formData: {}, // 附带的表单数据
uploadUrl: '', // 上传的地址
file: {}, // 上传的文件信息
}
},
methods: {
// 处理上传点击事件
handleUploadClick() {
this.$refs.uploader.inputElement.click()
},
// beforeRead
beforeRead(file) {
const isJPG = file.type.indexOf('image') == 0
const isLt2M = file.size / 1024 / 1024 < 2
if (!isJPG) {
this.$toast('上传文件只能是图片格式!')
}
if (!isLt2M) {
this.$toast('上传文件大小不能超过 2MB!')
}
return isJPG && isLt2M
},
// afterRead
afterRead(files) {
this.file = files[0]
},
// begin
begin({ file, fileList }) {
this.$emit('begin', { file, fileList })
},
// success
success(response, file, fileList) {
file.url = response.data.url
file.id = response.data.id
this.$emit('success', { response, file, fileList })
},
// fail
fail(error, file, fileList) {
this.$emit('fail', { error, file, fileList })
}
}
}
</script>
在这里,我们将maxCount
设置为1,即只能上传一个文件。在上传之后,我们将文件对象保存到了file
变量中。
示例2:上传多个文件
在这个示例中,我们创建了一个上传多个文件的组件。
<template>
<div>
<van-button type="primary" @click="handleUploadClick">
上传文件
</van-button>
<van-uploader
ref="uploader"
:max-count="5"
:preview-image="false"
:multiple="true"
:name="formData.name"
:accept="accepts"
:headers="headers"
:action="uploadUrl"
:data="formData"
@before-read="beforeRead"
@after-read="afterRead"
@begin="begin"
@success="success"
@fail="fail"
>
<template #upload">
<van-icon name="camera" size="24"/>
</template>
</van-uploader>
</div>
</template>
<script>
export default {
data() {
return {
files: [], // 上传的文件列表
maxCount: 5, // 最大上传数量
accepts: '', // 文件类型限制
headers: {}, // HTTP头部
formData: {}, // 附带的表单数据
uploadUrl: '', // 上传的地址
}
},
methods: {
// 处理上传点击事件
handleUploadClick() {
this.$refs.uploader.inputElement.click()
},
// beforeRead
beforeRead(file) {
const isJPG = file.type.indexOf('image') == 0
const isLt2M = file.size / 1024 / 1024 < 2
if (!isJPG) {
this.$toast('上传文件只能是图片格式!')
}
if (!isLt2M) {
this.$toast('上传文件大小不能超过 2MB!')
}
return isJPG && isLt2M
},
// afterRead
afterRead(files) {
this.files = this.files.concat(files)
if (this.files.length >= this.maxCount) {
this.$refs.uploader.inputElement.disabled = true
}
},
// begin
begin({ file, fileList }) {
this.$emit('begin', { file, fileList })
},
// success
success(response, file, fileList) {
file.url = response.data.url
file.id = response.data.id
this.$emit('success', { response, file, fileList })
},
// fail
fail(error, file, fileList) {
this.$emit('fail', { error, file, fileList })
}
}
}
</script>
在这里,我们将multiple
设置为true,即允许上传多个文件。在上传之后,我们将所有上传的文件保存到了files
变量中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue vantUI实现文件(图片、文档、视频、音频)上传(多文件) - Python技术站