element-ui+vue2实现粘贴上传

news2024/9/9 0:43:13

element-ui+vue2实现粘贴上传

<style scoped lang="scss">
    .img-upload{
        position: relative;
        display: inline-block;
        margin-right: 9px;
    }
    .image {
        width: 100px;
        height: 100px;
        margin-right: 9px;
    }
    .image:last-child{
        margin-right: 0;
    }
    .img-upload .el-upload--picture-card,.img-upload .el-upload-list__item{
        height: 100px;
        width: 100px;
        line-height: 100px;
    }
    .img-upload .el-icon-close-tip{
        display: none !important;
    }
    .img-upload .el-upload-list__item-status-label{
        display: none !important;
    }
    .hide .el-upload--picture-card {
        display: none;
    }
    .img-upload-title-required:before {
        content: '*';
        color: #F56C6C;
        margin-right: 4px;
    }
    .el-upload__tip{
        color: red;
    }
    .hide.el-upload-list .el-upload-list__item.is-focus {
        border: 2px solid red; /* 设置选中图片的红色边框样式 */
    }
</style>



<script async defer>
    var uploadMultiImage  = {
        template:`
            <div class="img-upload">
                <div v-if="!detail">
                    <el-upload
                      ref="upload"
                      :class="{hide:hideUpload}"
                      :action="action"
                      list-type="picture-card"
                      :limit="limit"
                      :file-list="fileList"
                      :multiple="multiple"
                      :on-success="uploadSuccess"
                      :on-exceed="uploadExceed"
                      :on-change="uploadChange"
                      :on-remove="uploadRemove"
                      :on-preview="handlePictureCardPreview"
                      @paste.native="handlePaste">
                      <i class="el-icon-plus"></i>
                    </el-upload>
                    <div :class="required?'img-upload-title img-upload-title-required':'img-upload-title'">{{title}}</div>
                    <div v-if="tip" slot="tip" class="el-upload__tip">{{tip}}</div>
                </div>
                <div v-else>
                    <div v-if="imageList" >
                        <el-image v-for="(item,index) in fileList"  :key=item.url :src="item.url+'?w=80&h=80'" class="image" :preview-src-list="[item.url]" @click.stop="handleClickItem"></el-image>
                    </div>
                </div>
                <el-dialog :visible.sync="dialogVisible">
                  <img width="100%" :src="dialogImageUrl" alt="">
                </el-dialog>
            </div>
        `,
        props: {
            urls:{
                type: [String, Array],
                default(){
                    return []
                }
            },
            action:{
                type:String,
                default:'/v1/api/index/upload'
            },
            detail:{
                type:Boolean,
                default:false
            },
            multiple:{
                type:Boolean,
                default:false
            },
            title:{
                type:String,
                default:''
            },
            limit:{
                type:Number,
                default:1
            },
            required:{
                type:Boolean,
                default:false
            },
            tip:{
                type:String,
                default:''
            },
        },
        model:{
            prop:'urls',
            event:'valChange'
        },
        created(){

        },
        watch:{
            urls(val){
                this.imageList = val
            },
        },
        data(){
            return {
                fileList: this.pathUrls(this.urls),
                imageList: this.urls,
                hideUpload: this.isHideUpload(this.urls),
                dialogImageUrl: '',
                dialogVisible: false
            }
        },
        mounted() {

        },
        computed:{

        },
        methods:{
            /**
             * 监听粘贴操作
             */
            handlePaste(e) {
                var clipboardData = e.clipboardData; // IE
                if (!clipboardData) {
                    //chrome
                    clipboardData = e.originalEvent.clipboardData;
                }
                var items='';
                items = (e.clipboardData || window.clipboardData).items;
                let file = null;
                if (!items || items.length === 0) {
                    this.$message.error('当前浏览器不支持粘贴本地图片,请打开图片复制后再粘贴!');
                    return;
                }
                // 搜索剪切板items
                for (let i = 0; i < items.length; i++) {
                    // 限制上传文件类型
                    if (items[i].type.indexOf('image') !== -1) {
                        file = items[i].getAsFile();
                        break;
                    }
                }
                // 对复制黏贴的类型进行判断,若是非文件类型,比如复制黏贴的文字,则不会调用上传文件的函数
                if(file){
                    // console.log(file)
                    // // 生成一个本地的URL用于预览
                    // const url = URL.createObjectURL(file);
                    // console.log(url)
                    // 添加到fileList中,这里示意性地只存放url,实际应根据需求进行适当处理
                    //this.fileList.push({ url: url });
                    let formData = new FormData();
                    formData.append('file', file, 'pasted_image.png'); // 'file' 是后端接口接收文件的字段名,'pasted_image.png' 是文件名
                    console.log(formData);
                    // 上传文件到服务器
                    this.uploadPastedImage(formData);
                }
            },

            uploadPastedImage(formData) {
                fetch(this.action, {
                    method: 'POST',
                    body: formData
                })
                    .then(response => response.json())
                    .then(data => {
                        if (data.code) {
                            console.log(data);
                            const newFile = {
                                name: 'pasted_image.png',
                                url: data.domain + '/' + data.data[0],
                                uid: Date.now(), // 确保每个文件有唯一的uid
                                status: 'success' // 设置文件状态为成功
                            };
                            //this.fileList = this.fileList.filter(file => !file.url.startsWith('blob:'));
                            this.fileList.push(newFile);
                            this.valChange();
                        } else {
                            this.$message.error('上传失败,请稍后重试');
                        }
                    })
                    .catch(error => {
                        this.$message.error('网络错误,请稍后重试');
                        console.error('Error:', error);
                    });
            },

            pathUrls(urls){
                let fileList = []
                if(urls.length>0){
                    urls.forEach(function(v) {
                       if(!v.includes('http')){
                           fileList.push({
                               'name': v,
                               'url':'http://image.spocoo.com/' + v,
                           })
                       }else {
                           fileList.push({
                               'name': v,
                               'url': v,
                           })
                       }
                    });
                }
                return fileList
            },
            nameUrls(fileList){
                let urls = []
                fileList.forEach(function(v) {
                    if(v.response){
                        urls.push(v.response.data[0])
                    }else{
                        urls.push(v.url)
                    }
                });
                return urls
            },
            isHideUpload(urls){
                return urls.length >= this.limit;
            },
            uploadSuccess(res,file, fileList){
                if (res.code){
                    this.fileList = fileList
                    this.valChange()
                }else{
                    layer.msg('网络走丢了,请稍后重试上传哦')
                }
            },
            uploadExceed(){
                layer.msg(this.title+'最多可以上传'+this.limit+'张图片')
            },
            uploadChange(file, fileList) {
                this.hideUpload = fileList.length >= this.limit;
            },
            uploadRemove(file, fileList) {
                this.fileList.splice(this.fileList.findIndex(e => e.url === file.url), 1)
                this.hideUpload = fileList.length >= this.limit;
                this.valChange()
            },
            //预览
            handlePictureCardPreview(file) {
                this.dialogImageUrl = file.url;
                this.dialogVisible = true;
            },
            valChange(){
                this.$emit('valChange',this.nameUrls(this.fileList))
            },
            handleClickItem(){
                this.$nextTick(()=>{
                    // 获取遮罩层dom
                    let domImageMask = document.querySelector(".el-image-viewer__mask");
                    if (!domImageMask) {
                        return;
                    }
                    domImageMask.addEventListener("click", () => {
                        // 点击遮罩层时调用关闭按钮的 click 事件
                        document.querySelector(".el-image-viewer__close").click();
                    });
                })
            }
        }
    }
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议&#xff0c;并完成了初稿。 本周继续修改论文&#xff0…

【Git】 如何将一个分支的某个提交合并到另一个分支

【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时&#xff0c;常常会遇到这样的需求&#xff1a;将某个分支的特定提交合并到另一个分支中。这种情况下&#xff0c;我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…

定时任务报错问题,通级下还有其他定时任务却没有报错,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

R语言统计分析——条形图

参考资料&#xff1a;R语言实战【第2版】 条形图通过垂直的或水平的条形展示了类别型变量的分布&#xff08;频数&#xff09;。函数barplot()的最简单用法是&#xff1a; barplot(height) 其中height是一个向量或一个矩阵。 本文中数据案例来自“vcd”包&#xff0c;需在第一…

JQuery异步请求与Flask后端通信、this和event指针汇总

目录 一.JQuery与Flask通信的三种方法 1.1$.ajax() 1.2$.get() 1.3$.post() 二.forEach()方法 三.this指针 3.1为什么要用this指针 3.2this的指向 3.3this指针的四种绑定方式 3.3.1默认绑定 3.3.2隐式绑定 3.3.3显式绑定 3.3.4new绑定 3.3.5通过标签调用this指针…

windows server服务器/linux服务器离线安装pandas

windows server服务器/linux服务器离线安装pandas pypi官网下载whl文件速度较慢&#xff0c;推荐使用国内的镜像源来下载&#xff0c;镜像源地址为 清华大学 &#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple…

docker安装与container基本使用

安装 Homebrew 的 Cask 已经支持 Docker for Mac, mac用户狂喜 brew install --cask --appdir/Applications docker其他入门用法可参考 Docker Hello World- 菜鸟教程 或网上自行搜索博客学习。本文主要记录我运行go-zero-mall用到的一些注意点。当然&#xff0c;gonivinck项…

vue2+cesium实现报警特效

实现效果: 录制_2024_07_29_21_36_33_571 实现步骤如下: 1、安装cesium包:npm install cesium 2、在node-modules中找到刚刚安装的cesium,在文件夹中里面有一个Build文件夹,把Build里面的Cesium复制出来丢到public中 3、在index.html中进行引入: 4、新建一个js文件,…

前端常见场景、JS计算精度丢失问题(Decimal.js 介绍)

目录 一. Decimal.js 介绍 二. 常用方法 1. 创建 Decimal 实例 2.加法 add 或 plus 3.减法 sub 或 minus 4.乘法 times 或 mul 5.除法 div 或 dividedBy 6.取模 7.幂运算 8.平方根 9.保留小数位 toFixed方法(四舍五入) 三.项目应用 前端精度丢失问题通常由以下原因…

无线融合,智能协同:ECWAN打造物联网高效协同网络

关键词&#xff1a;资产管理、ECWAN、无线混合组网、用电监测、用电计量、广域基站、计量插座、边缘协同 在当今快速发展的物联网领域&#xff0c;每天都有数以亿计的设备互相通信&#xff0c;形成庞大而复杂的网络生态。在这样的背景下&#xff0c;ECWAN技术以其灵活、高效和智…

【Linux】TCP全解析:构建可靠的网络通信桥梁

文章目录 前言1. TCP 协议概述2. TCP报头结构3. 如何理解封装和解包呢&#xff1f;4. TCP的可靠性机制4.1 TCP的确认应答机制 4.2 超时重传机制5. TCP链接管理机制5.1 经典面试题&#xff1a;为什么建立连接是三次握手&#xff1f;5.2 经典面试题&#xff1a;为什么要进行四次挥…

读零信任网络:在不可信网络中构建安全系统04最小特权

1. 公钥基础设施 1.1. PKI 1.2. 数字证书本身并不能解决身份认证问题 1.2.1. 需要一种方法来验证获得的公钥的确属于某人 1.2.2. 公钥基础设施&#xff08;PKI&#xff09;解决了这个问题 1.3. PKI定义了一组角色及其职责&#xff0c;能够在不可信的网络中安全地分发和验证…

【Websim.ai】一句话让AI帮你生成一个网页

【Websim.ai】一句话让AI帮你生成一个网页 网站链接 websim.ai 简介 websim.ai接入了Claude Sonnet 3.5&#xff0c;GPT-4o等常用的LLM&#xff0c;只需要在websim.ai的官网指令栏中编写相关指令&#xff0c;有点类似大模型的Prompt&#xff0c;指令的好坏决定了网页生成的…

Lc63---1859将句子排序(排序)---Java版(未写完)

1.题目描述 2.思路 &#xff08;1&#xff09;首先将句子按空格分割成若干单词。 &#xff08;2&#xff09;每个单词的最后一个字符是它的位置索引。我们可以通过这个索引将单词恢复到正确的位置。 &#xff08;3&#xff09;按照单词的索引顺序排序这些单词。 &#xff08;4…

【已解决】嵌入式linux mobaxterm unable to open connection to comx 串口正常连接,但终端无法输入

1.点击Session重新选择串口&#xff0c;注意看看串口是不是连接到虚拟机&#xff0c;导致串口被占用。 2.选择PC机与开发板连接的串口&#xff0c;不知道的话可以打开设备管理器看看&#xff0c;选择正确的波特率&#xff0c;一般是115200。 3.关键一步&#xff1a;选择后别急…

性能测试:深入探索与实战指南

大家好&#xff0c;我是一名测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家联系我&#xff0c;一起【分享测试知识&#xff0c;交流测试技术】 在当今这个信息化、数字化的时代&#xff0c;软件系统的性能直接关乎到用户体验…

使用 Matlab 绘制带有纹理的柱状图

以下是效果 1. 在 Matlab 里安装两个额外的库&#xff1a; hatchfill2 和 legendflex。 &#xff08;1&#xff09;搜索并安装 hatchfill2&#xff0c;用来画纹理 (2) 搜索并安装 legendflex&#xff0c;用来画自定义的图例 2. 代码&#xff08;说明见注释&#xff09; data …

Centos 7系统(最小化安装)安装Git 、git-man帮助、补全git命令-详细文章

安装之前由于是最小化安装centos7安装一些开发环境和工具包 文章使用国内阿里源 cd /etc/yum.repos.d/ && mkdir myrepo && mv * myrepo&&lscurl -O https://mirrors.aliyun.com/repo/epel-7.repo;curl -O https://mirrors.aliyun.com/repo/Centos-7…

docker安装phpMyAdmin

直接安装phpMyAdmin需要有php环境&#xff0c;比较麻烦&#xff0c;总结了使用docker安装方法&#xff0c;并提供docker镜像。 1.docker镜像 见我上传的docker镜像&#xff1a;https://download.csdn.net/download/taotao_guiwang/89595177 2.安装 1).加载镜像 docker load …

(leetcode学习)24. 两两交换链表中的节点

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4…