vue使用elementUI的upload上传文件封装

这篇具有很好参考价值的文章主要介绍了vue使用elementUI的upload上传文件封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章的目的

将文件上传的方法封装一下,供大家统一调用,
话不多说,直接上代码

upload 核心参数说明

  1. action 上传的地址
  2. accept 接受上传的文件类型
  3. multiple 是否开启多文件上传模式
  4. limit 限制上传个数
  5. fileList 文件列表
  6. disabled 是否禁用

upload 核心方法说明

  • before-upload 上传文件之前的钩子.
  • on-success 上传成功的钩子函数
  • on-error 文件上传失败时的钩子
  • on-exceed 文件超出个数限制时的钩子
  • on-remove 文件列表移除文件时的钩子
  • on-preview 点击文件列表中已上传的文件时的钩子.
  • on-progress 文件上传时的钩子 进度条展示的基础

核心局部代码说明

html中

插槽的使用

子组件

   <slot name="uploadBtn"></slot>

调用上传组件的父组件

    <uploadBtn>
        <template v-slot="uploadBtn">
            <img src='http://test/upload.img'></img>
        </template>
    </uploadBtn>

说明

使用了具名插槽 将上传的按钮放在父组件调用子组件标签的容器中,这样的好处是:随意定制按钮不需要写一堆的条件判断,且可定制上传按钮


js中

office 自动预览的使用

data定义office基础路径

    officeOnlineAddress:'https://view.officeapps.live.com/op/view.aspx?src=',

office基础路径拼接文件路径并预览

   const preveiewURL = this.officeOnlineAddress + target
   window.open(preveiewURL)

说明

office基础路径拼接文件路径并用window.open即可实现文件的预览

beforeUpload 上传文件之前的拦截处理

代码

    beforeUpload(file) {
        const { name = '', size } = file
        if (size > this.maxSize * 1024 * 1000) {
            this.$Message.warning(`文件最大仅支持${this.maxSize}M`)
            return false
        }

        if (!this.acceptTypeList.includes(name.split('.').pop())) {
            this.$Message.warning(
                `文件格式仅支持${this.acceptTypeList.join(',')}`
            )
            return false
        }
    },

说明

  • 文件大小大于父组件传入的maxSize则拦截并提示
  • 文件格式不正确则拦截并提示
  • beforeUpload函数体中,如果函数的返回值是false,则终止上传

文件预览的操作

代码

    preview (data) {
        const { url, response = {} } = data || {}
        let name = data.name
        const downLoadTypeList = this.downLoadTypeList
        const preveiwTypeList = this.preveiwTypeList
        if (!name) {
            name = ''
        }
        const suffixFileType = name.split('.').pop()
        if (downLoadTypeList.includes(suffixFileType)) {
            //下载 'doc', 'docx', 'xlsx', 'xls', 'txt' 文件
            name = name.replace(/&/g, '') // & 不兼容
            const target = encodeURIComponent(
                Base64.encode(
                    `${
                        location.origin
                    }/api/abk/web/v1/resource/file?fileId=${
                        url || response.data
                    }&fullfilename=${name}&sid=4AC67ADB4E264AB0A8B899A671072875`
                )
            )
            if (
                this.officePreviewFlag &&
                this.officeType.includes(suffixFileType)
            ) {
                // office预览的
                const preveiewURL = this.officeOnlineAddress + target
                window.open(preveiewURL)
            } else {
                // 非office预览
                window.open(
                    `https://test/preview/onlinePreview?url=${target}`,
                    '_blank'
                )
            }
        } else if (preveiwTypeList.includes(suffixFileType)) {
            //新窗口打开 预览图片文件
            window.open(
                '/api/abk/web/v1/resource/file?fileId=' +
                    (url || response.data),
                '_blank'
            )
        }
    },

说明

  • 使用 name.split(‘.’).pop() 拿到文件的后缀名
  • 根据传入的 downLoadTypeList(需要下载的文件类型)、preveiwTypeList(可以直接预览的文件类型)、officePreviewFlag(office文件类型)以及officePreviewFlag(是否启用office预览)和文件后缀名匹配
  • 需要下载的文件类型 根据后端的下载基础路径拼接得到下载地址,并结合windwo.open下载
  • 可以直接预览的文件类型 根据后端的预览基础路径拼接得到下载地址,并结合windwo.open 预览
  • office文件类并且启用了office预览直接调用office预览路径(https://view.officeapps.live.com/op/view.aspx?src=)

进度条处理

html

<el-progress v-if="showProcessFlag&&processFlag" :percentage="loadProcess"></el-progress>

js

   onProgressFn(event, file, fileList){
    this.processFlag = true
    this.loadProcess =  event.percent.toFixed(2)
    if(this.loadProcess>=100){
        this.loadProcess= 100
        this.$nextTick(()=>{
            this.processFlag = false
        })
    }
    }

说明文章来源地址https://www.toymoban.com/news/detail-703074.html

  • 用户启用了进度条(showProcessFlag为true) 并且 processFlag的值为true(当进度条的值存在并且小于100时)
  • 当进度大于等于100时需要隐藏进度条,为了保险起见,此处加了 $nextTick,当然了setTimeout(()=>{},0)也可以
<template>
    <div>
        <!--action="/api/abk/web/v1/resource/file" -->
        <el-upload
            :action="actionUrl"
            style="width: 100%"
            :on-success="(response, file) => successUpload(response, file)"
            :on-error="errorUpload"
            :accept="acceptTypeList.join('|')"
            :before-upload="beforeUpload"
            :multiple="multiple"
            :limit="maxLimit"
            :on-exceed="handleExceed"
            :file-list="fileList"
            :disabled="disabledFlag"
            :on-remove="(file, fileList) => removeFile(file, fileList)"
            :on-preview="(file) => preview(file)"
            :on-progress="(event, file, fileList)=>onProgressFn(event, file, fileList)"
        >
        <!-- 上传的按钮 或者 icon 通过具名插槽的方式 -->
          <slot name="uploadBtn"></slot>
        </el-upload>
        <el-progress v-if="showProcessFlag&&processFlag" :percentage="loadProcess"></el-progress>
    </div>
</template>

<script>
export default {
    name: 'UploadFile',
    props: {
        actionUrl: {
            //上传的地址
            type: String,
            default: '',
        },
        acceptTypeList: {
            //接受的文件类型
            type: Array,
            default: () => {
                return []
                //  ['doc', 'docx', 'xlsx', 'xls', 'txt', 'pdf','jpg','jpeg','png','zip,'rar']
            },
        },
        multiple: {//是否开启多图上传
            type: Boolean,
            default: false,
        },
        maxLimit: {
            // 最大上传个数限制
            type: Number | String,
            default: 1,
        },
        maxSize:{
            // 文件上传的最大体积 M
            type: Number | String,
            default: 4,

        },
        disabledFlag: {
            //是否禁用
            type: Boolean,
            default: false,
        },
        fileList: {//文件列表
            type: Array,
            default: () => {
                return []
            },
        },
        extraData: {}, //上传时的额外参数 如 name等
        /* 
        {
            name:'12321'
        }
        */
        dragFlag: {
            type: Boolean,
            default: true, //是否启用拖拽上传 此处默认启用  element 官方默认是 不启用的
        },
        downLoadTypeList: {
            //需要下载的文件类型
            type: Array,
            default: () => {
                return ['doc', 'docx', 'xlsx', 'xls', 'txt']
            },
        },
        preveiwTypeList: {
            //需要预览的文件类型
            type: Array,
            default: () => {
                return ['pdf', 'jpg', 'jpeg', 'png']
            },
        },
        officePreviewFlag: {
            //是否启用office在线预览
            type: Boolean,
            default: false,
        },
        showProcessFlag:{
            //是否显示进度条
            type: Boolean,
            default: false,
        },
    },
    // office预览
    // https://view.officeapps.live.com/op/view.aspx?src=
    // https://view.officeapps.live.com/op/view.aspx?src=文档地址
    //
    data() {
        return {
            officeOnlineAddress:
                'https://view.officeapps.live.com/op/view.aspx?src=',
            officeType: ['doc', 'docx', 'xlsx', 'xls'],
            processFlag:false,//是否显示进度条
            loadProcess:0//进度条的刻度值
        }
    },

    mounted() {},

    methods: {
        // 上传图片 成功
        successUpload(response, file) {
            if (response.rt.status === 200) {
                this.fileList.push({
                    url: response.data,
                    name: file.name,
                })
            } else {
                this.$Message.info(response.data)
            }
        },
        errorUpload(res) {
            this.$Message.info('上传失败请重试!')
        },
        beforeUpload(file) {
            const { name = '', size } = file
            if (size > this.maxSize * 1024 * 1000) {
                this.$Message.warning(`文件最大仅支持${this.maxSize}M`)
                return false
            }

            if (!this.acceptTypeList.includes(name.split('.').pop())) {
                this.$Message.warning(
                    `文件格式仅支持${this.acceptTypeList.join(',')}`
                )
                return false
            }
        },
        handleExceed(files, fileList) {
            this.$Message.warning(
                `当前限制选择 10 个文件,本次选择了 ${
                    files.length
                } 个文件,共选择了 ${files.length + fileList.length} 个文件`
            )
        },
        // 移除文件
        removeFile(file, data) {
            console.log(file, data)
            this.fileList = data
        },
        // 预览
        preview (data) {
            const { url, response = {} } = data || {}
            let name = data.name
            const downLoadTypeList = this.downLoadTypeList
            const preveiwTypeList = this.preveiwTypeList
            if (!name) {
                name = ''
            }
            const suffixFileType = name.split('.').pop()
            if (downLoadTypeList.includes(suffixFileType)) {
                //预览 'doc', 'docx', 'xlsx', 'xls', 'txt' 文件
                name = name.replace(/&/g, '') // & 不兼容
                const target = encodeURIComponent(
                    Base64.encode(
                        `${
                            location.origin
                        }/api/abk/web/v1/resource/file?fileId=${
                            url || response.data
                        }&fullfilename=${name}&sid=4AC67ADB4E264AB0A8B899A671072875`
                    )
                )
                if (
                    this.officePreviewFlag &&
                    this.officeType.includes(suffixFileType)
                ) {
                    // office预览的
                    const preveiewURL = this.officeOnlineAddress + target
                    window.open(preveiewURL)
                } else {
                    // 非office预览
                    window.open(
                        `https://test/preview/onlinePreview?url=${target}`,
                        '_blank'
                    )
                }
            } else if (preveiwTypeList.includes(suffixFileType)) {
                //新窗口打开 预览图片文件
                window.open(
                    '/api/abk/web/v1/resource/file?fileId=' +
                        (url || response.data),
                    '_blank'
                )
            }
        },
        onProgressFn(event, file, fileList){
            this.processFlag = true
            this.loadProcess =  event.percent.toFixed(2)
            if(this.loadProcess>=100){
                this.loadProcess= 100
                this.$nextTick(()=>{
                    this.processFlag = false
                })
            }
        }
    },
}
</script>

<style lang="scss" scoped>
</style>

List){
            this.processFlag = true
            this.loadProcess =  event.percent.toFixed(2)
            if(this.loadProcess>=100){
                this.loadProcess= 100
                this.$nextTick(()=>{
                    this.processFlag = false
                })
            }
        }
    },
}
</script>

<style lang="scss" scoped>
</style>

到了这里,关于vue使用elementUI的upload上传文件封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传

    1. 前言 文件上传 小文件(图片、文档、视频)上传可以直接使用很多ui框架封装的上传组件,或者自己写一个input 上传,利用FormData 对象提交文件数据,后端使用spring提供的MultipartFile进行文件的接收,然后写入即可。但是对于比较大的文件,比如上传2G左右的文件(http上传

    2024年02月06日
    浏览(48)
  • Vue+elementUI中的el-upload实现上传文件给后端,限制上传文件的格式、文件的大小、文件的数量,将表单和Excel文件一起提交给后端

    需求:1.表单输入信息 2.上传Excel附件 3.下载附件模板 4.限制上传文件的格式、文件的大小、文件的数量 5.将表单和Excel文件一起提交给后端 效果图: 样式部分 data部分代码 method中的代码

    2024年02月12日
    浏览(60)
  • ElementUI —— Upload 文件上传

    前言 :            实现单文件上传!此文章仅记录代码如何实现,便于后期项目学习使用!! 代码实现 :

    2024年02月16日
    浏览(60)
  • elementui el-upload 上传文件

    在使用element中的el-upload上传文件或者图片时,需要先把el-upload的自动上传改为手动上传:auto-upload=“false”然后el-upload内部会调用this.$refs.upload.submit();方法,从而实现多个文件上传。 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下(示例): 需要注意的是 acce

    2024年02月06日
    浏览(54)
  • springboot + vue + elementui — upload解决跨域、实现图片上传

    今日记录通过elementui上传时得到的问题。 我们在本地部署的服务,前端服务请求后端接口,存在跨域问题, 跨域问题确实是由 Web浏览器的同源策略 引起的。同源策略是浏览器的一项安全机制,它限制了从一个源加载的文档或脚本如何与来自其他源的资源进行交互。 同源策略要

    2024年02月10日
    浏览(44)
  • vue 使用 el-upload 上传文件(自动上传/手动上传)

    vue 使用 el-upload 上传文件(自动上传/手动上传) 上传 上传

    2024年02月13日
    浏览(60)
  • elementUI+el-upload 上传、下载、删除文件以及文件展示列表自定义为表格展示

    官方文档 https://element.eleme.cn/#/zh-CN/component/upload 具体参数说明,如何实现上传、下载、删除等功能 action :文件上传地址,我的项目里已经封装好了请求。使用的时候需要依据项目填写。 show-file-list : 是否显示已上传文件列表。 headers :设置上传的请求头部。我的项目需要传

    2024年01月20日
    浏览(58)
  • vue实战--vue+elementUI实现多文件上传+预览(word/PDF/图片/docx/doc/xlxs/txt)

        最近在做vue2.0+element UI的项目中遇到了一个需求:需求是多个文件上传的同时实现文件的在线预览功能。需求图如下:     看到这个需求的时候,小栗脑袋一炸。并不知道该如何下手,之前的实践项目中也并没有遇到相似的功能。因此也废了一番功夫想要实现这样一个

    2024年01月23日
    浏览(82)
  • vue Element ui上传组件el-upload封装

    注释: 1. limit 可上传图片数量 2. lableName 当前组件name,用于一个页面多次使用上传组件,对数据进行区分 3. upload 上传图片发生变化触发,返回已上传图片的信息 4. imgUrl 默认图片

    2024年02月11日
    浏览(63)
  • 【前端相关】elementui使用el-upload组件实现自定义上传

    elmentui 中的upload默认的提交行为是通过 action 属性中输入的 url 链接,提交到指定的服务器上。但是这种url提交文件的方式,在实际的项目环境中往往是不可取的。 我们的服务器会拦截所有的请求,进行权限控制,密钥检查,请求头分析等安全行为控制。写在这里的url无法实

    2024年02月08日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包