使用ElementUI el-upload实现一次性上传多个文件
作者:繁依Fanyi
引言
在日常的前端开发中,文件上传是一个非常常见的需求,尤其是在用户需要一次性上传多个文件的场景下。ElementUI作为一款非常优秀的Vue.js 2.0组件库,为我们提供了丰富的UI组件,极大地提升了开发效率。其中,el-upload组件便是一个功能强大且易于使用的文件上传组件。
el-upload组件介绍
el-upload是ElementUI提供的文件上传组件,支持多种文件上传方式,如普通上传、拖拽上传、图片上传等。这个组件不仅能满足单文件上传的需求,还能轻松实现一次性上传多个文件。更重要的是,el-upload组件的API设计非常简洁明了,开发者可以根据自己的需求进行灵活配置。
基本用法
在开始讲解具体实现之前,我们先来看一下el-upload组件的基本用法。以下是一个简单的单文件上传示例:
<template> <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" :on-preview="handlePreview" :on-remove="handleRemove" :file-list="fileList" :auto-upload="false"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> <script> export default { data() { return { fileList: [] }; }, methods: { handlePreview(file) { console.log(file); }, handleRemove(file, fileList) { console.log(file, fileList); }, submitUpload() { this.$refs.upload.submit(); } } } </script>
在这个示例中,我们通过el-upload组件实现了一个简单的文件上传功能。action
属性指定了文件上传的服务器地址,file-list
用于管理已选取的文件列表,on-preview
和on-remove
则分别用于文件预览和删除的回调。
实现多文件上传
为了实现一次性上传多个文件,我们只需要在el-upload组件中设置multiple
属性即可。该属性允许用户在文件选择对话框中一次性选取多个文件。以下是一个多文件上传的示例:
<template> <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" :on-preview="handlePreview" :on-remove="handleRemove" :file-list="fileList" :auto-upload="false" multiple> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">可以上传多个文件</div> </el-upload> </template> <script> export default { data() { return { fileList: [] }; }, methods: { handlePreview(file) { console.log(file); }, handleRemove(file, fileList) { console.log(file, fileList); }, submitUpload() { this.$refs.upload.submit(); } } } </script>
在这个示例中,我们添加了multiple
属性,使得文件选择对话框允许一次性选择多个文件。这样,用户便可以轻松地实现批量上传。
文件上传的更多配置
el-upload组件不仅支持多文件上传,还提供了丰富的配置项,满足各种文件上传需求。下面我们详细介绍一些常用的配置项:
headers 自定义请求头
在文件上传时,如果需要添加自定义请求头,可以通过headers
属性进行配置。以下是一个添加自定义请求头的示例:
<el-upload action="https://jsonplaceholder.typicode.com/posts/" :headers="{ Authorization: 'Bearer YOUR_TOKEN' }"> </el-upload>
data 上传附带参数
在文件上传时,如果需要附带一些额外的参数,可以通过data
属性进行配置。以下是一个上传时附带额外参数的示例:
<el-upload action="https://jsonplaceholder.typicode.com/posts/" :data="{ userId: 123 }"> </el-upload>
limit 限制上传文件数量
如果需要限制上传文件的数量,可以通过limit
属性进行配置,并结合on-exceed
事件进行处理。以下是一个限制最多上传3个文件的示例:
<template> <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" :file-list="fileList" :limit="3" :on-exceed="handleExceed" multiple> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> </el-upload> </template> <script> export default { data() { return { fileList: [] }; }, methods: { handleExceed(files, fileList) { this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`); } } } </script>
before-upload 上传前的钩子
在文件上传之前,如果需要对文件进行一些处理或校验,可以使用before-upload
钩子。以下是一个在上传前进行文件大小校验的示例:
<template> <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" :before-upload="beforeUpload" multiple> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> </el-upload> </template> <script> export default { methods: { beforeUpload(file) { const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { this.$message.error('上传文件大小不能超过 2MB!'); } return isLt2M; } } } </script>
在这个示例中,我们在文件上传前对文件大小进行了校验,如果文件大小超过2MB,则会提示错误信息并阻止上传。
拖拽上传
el-upload组件还支持拖拽上传功能,用户可以通过拖拽文件到指定区域来实现文件上传。以下是一个拖拽上传的示例:
<template> <el-upload class="upload-demo" drag action="https://jsonplaceholder.typicode.com/posts/" multiple> <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> <div class="el-upload__tip" slot="tip">支持批量上传</div> </el-upload> </template>
在这个示例中,我们通过添加drag
属性,使得el-upload组件支持拖拽上传。用户可以将文件拖拽到指定区域,轻松实现文件上传。
自定义上传请求
有时,我们可能需要对上传请求进行更细粒度的控制,例如使用axios
等库进行上传。el-upload组件提供了http-request
钩子,允许我们自定义上传请求。以下是一个使用axios
自定义上传请求的示例:
<template> <el-upload class="upload-demo" :http-request="customRequest" multiple> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> </el-upload> </template> <script> import axios from 'axios'; export default { methods: { customRequest({ file, onProgress, onSuccess, onError }) { const formData = new FormData(); formData.append('file', file); axios.post('https://jsonplaceholder.typicode.com/posts/', formData, { onUploadProgress: (event) => { let percent = Math.round((event.loaded * 100) / event.total); onProgress({ percent }); } }).then(response => { onSuccess(response.data); }).catch(error => { onError(error); }); } } } </script>
在这个示例中,我们使用axios
库自定义了上传请求。通过http-request
钩子,我们可以完全控制上传过程,并实现更加灵活的上传逻辑。
小结
ElementUI的el-upload组件为我们提供了强大的文件上传功能,不仅支持单文件上传,还可以轻松实现一次性上传多个文件。通过灵活配置组件的各项属性和钩子函数,我们可以满足各种复杂的文件上传需求。无论是添加自定义请求头、上传附带参数,还是限制上传文件数量、拖拽上传,el-upload组件都能轻松应对。
在日常开发中,我们可以根据实际需求,对el-upload组件进行更深层次的定制和优化,从而提升用户体验和系统性能。希望这篇文章能够帮助大家更好地理解和使用el-upload组件,让文件上传变得更加简单和高效。
以上就是使用ElementUI el-upload实现一次性上传多个文件的详细内容,更多关于ElementUI el-upload上传多个文件的资料请关注脚本之家其它相关文章!