vue3+elementPlus通过el-upload实现文件只能上传一份

文章描述了一个使用Vue.js实现的文件上传组件,支持单文件上传、预览以及在只读模式下的操作。还包含了文件上传和删除的异步处理函数以及与父组件的通信机制。
摘要由CSDN通过智能技术生成
<template>

    <div class="td-upload">

        <span v-if="disignFile?.showTarget?.url">

            <!-- 文件跳转新窗口预览 -->

            <a :href="disignFile?.showTarget?.url" target="_blank">{{disignFile?.showTarget?.name}}</a>

            <!-- 删除文件按钮 -->

            <span class="remove-file" @click="delDesignFile" v-if="!readOnly">

                <el-icon><CloseBold /></el-icon>

            </span>

        </span>

        <span v-else>

            <el-upload

                action=''

                accept="*.*"

                :limit="1"

                :auto-upload="false"

                :show-file-list="false"

                :file-list="fileList"

                :on-change="getDesignFile">

                <el-icon><Plus class="task-icon"/></el-icon>

            </el-upload>

        </span>

        </div>

</template>



<script setup lang="ts">

    import { ref } from "vue"

    import {uploadFile, deleteFile} from "@/api/project";

    import { ElMessage } from "element-plus";

    const props = withDefaults(

        defineProps<{

            disignFile: any;//{showTarget:{resourceName:'',name:'',url:''},savedTarget:{resourceName:'',name:'',url:''}}

            type?: string; //产品 prod, 部件comp, 零件part, 其他other

            readOnly?: boolean; //只读模式

        }>(), {

            disignFile: {},

            type: 'other',

            readOnly: false,

        }

    )

    const emit = defineEmits(['changeDesign']);



    const fileList = ref<any>([]);



    async function getDesignFile(_:any, fileLists:any){

        let fileList:any;

        if (fileLists.length > 1) {

            fileList = [fileLists[fileLists.length - 1]]

        } else{

            fileList = fileLists

        }

        if(fileList.length === 0) return;

        const data = {...props.disignFile}

        data.showTarget = await upfile(props.type, fileList[0].raw)

        emit('changeDesign', data)

    }

    async function upfile(type:any, content:any){

        var form_data = new FormData()

        form_data.append("type", type)

        form_data.append("file", content)

        const res = await uploadFile(form_data);

        fileList.value = [];//limit设置为1,只上传一份文件的情况下,此代码为必须,否则会出现上传文件失败之后,不能再次上传的情况

        if(res?.code === 200 ){

            return {

                url:res.url,

                name:res.originalFilename,

                resourceName:res.resourceName,

            }

        }

        else{

            ElMessage({

                message: res?.msg || "上传文件失败",

                type: 'error',

            })

        }

        return {}

    }

    async function delDesignFile(){

        var delResult = await deleteFile(props.disignFile.showTarget)

        if (delResult?.code === 200){

            const data = {...props.disignFile}

            data.showTarget = {}

            emit('changeDesign', data)

        }

    }




</script>



<style lang="less" scoped>

    .td-upload{

        width: 100%;

        height: 100%;

        text-align: left;

        .remove-file{

            cursor: pointer;

        }

    }

</style>

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值