svg图片如何渲染到页面,以及svg文件的上传

svg图片渲染到页面的几种方式

  • 背景
  • 🟡require.context获取目录下的所有文件
  • 🟡方式1: 直接在html中渲染
  • 🟡方式: 发起ajax请求,获取SVG文件

背景

需要实现从本地目录下去获取所有的svg图标进行预览,将选中的图片显示在另一个地方,再上传。

🟡require.context获取目录下的所有文件

require.context中传入三个参数:一 个要搜索的目录,一个标记位表示是否还搜索其子目录, 以及一个匹配文件的正则表达式

// 获取该目录下的所有svg文件
const files = require.context('static/topology/icon', false, /\.svg$/);
const imgs = files.keys().map((key) => files(key));// 返回一个数组,存储的是base64字符串

这个字符串是一段base64编码后的SVG图片数据,可以直接在HTML/CSS中使用,进行图片的预览
在这里插入图片描述
🔸如果还想获取该svg图片的文件名

const iconImgs= ref<{ url: string; name: string }[]>([]);
 const files = require.context('static/topology/icon', false, /\.svg$/);
   const imgs = files.keys().map((key) => {
        iconImgs.value = key.split('/').pop(); // 提取文件名部分
        return {
            url: files(key), // base64编码的字符串
            name: fileName, // 文件名  xx.svg
        };
    });

🔸注意:如果在ts中使用会出现以下的警告: 类型"NodeRequire”上不存在属性"context”
在这里插入图片描述
🔸解决方法

npm install --save-dev @types/webpack-env
{
  "compilerOptions": {
    // other options...
    "types": [
      // other types...
      "webpack-env"
    ]
  }
}

🟡方式1: 直接在html中渲染

将base64字符串直接绑定到imgsrc上,一般用于图片的预览。

<div  v-for="(item, index) in iconImgs" :key="index" >
              <div
                :title="item.name.split('.')[0]">
                <img :src="item.url" />
              </div>
       </div>

🟡方式: 发起ajax请求,获取SVG文件

一般用于图片的回显,根据名称或者i d.

async function getImage(name = 'default') {
  try {
    const iconName = name || 'default';
    iconUrl = `${window.__ctx}/static/icon/${iconName}.svg`;
    //发起ajax请求,获取SVG文件
    const res = await $.ajax({
      url: iconUrl,
      type: 'GET',
      dataType: 'xml',
    });
    console.log('res', res);//打印见下图1
    
    // 解析SVG文件,获取SVG元素
    var svg = $(res).find('svg');
    console.log('svg:', svg);//打印见下图2
    
    if (!svg || svg.length === 0) throw new Error(`${name}.svg 图标不存在`);
    svg.css({ width: '96px', height: '96px' });//给svg图片设置样式
    // 将 svg 元素的 HTML 内容赋值给 iconImage,绑定到div的v-html就可以显示了
    iconImage.value = svg.prop('outerHTML');
    console.log('iconImage:', iconImage.value);//打印见下图2
    // 将svg图片变成文件,待上传
    //注意:这里传的一定是svg字符串,而且type一定是image/svg+xml格式(这边之前踩了坑!!)
      iconFile.value = new File([new Blob([iconImage.value], { type: 'image/svg+xml' })], `${name}.svg`, {
      type: 'image/svg+xml',
    });
  } catch (err) {
    console.log(`[log] - getImage - err:`, err);
    // 如果获取不到图标则使用默认图标
    if (name !== 'default') {
      await getImage('default');
    }
  }
}

🔸【图1】:是一个document文档
在这里插入图片描述
🔸【图2】:是一个svg元素,可使用$(res).find('svg')去获取.
将获取到的SVG文件内容转换成jQuery对象,然后通过jQuery对象的find()方法,筛选出其中的SVG元素。
在这里插入图片描述

🔸不借助jQuery的实现方法:
1.使用原生的DOMParser去解析

const parser = new DOMParser();
const xmlDoc = parser.parseFromString(svgStr, 'image/svg+xml');

2. querySelector 或者getElementsByTagName 方法获取 SVG 元素

const svgElement = xmlDoc.querySelector('svg');
const pathElements = xmlDoc.getElementsByTagName('path');

🔸【图3】:svg元素的内容,通过svg.prop('outerHTML')可以得到。
在这里插入图片描述
🔸将svg元素的内容显示在页面上:

         <div
            title="点击选择图标"
            style="width: 112px; height: 112px; border: 1px solid #c3cdd7"
            @click="showIconDialog"
            v-html="iconImage"></div>

💦小插曲
之前将svg转成文件后上传,服务器显示的文件是[object XMLDocument], 是由于请求的参数类型不正确导致的。
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/6aad3817ffef420d96525e64fb358535.png
一开始的错误写法:将svg文档转成字节流了

iconFile.value = new File([new Blob([res], { type: 'image/svg+xml' })], `${name}.svg`);

🔸正常的传参显示:svg元素的内容
在这里插入图片描述
🔸svg内容的两种形式的区别
在这里插入图片描述
前面的这个包含了一些冗余数据,后面这个是经过压缩的,只有 svg 路径数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

报道|新鲜出炉!INFORMS公布六位新任期刊主编

推文作者&#xff1a;徐思坤 编者按 INFORMS旗下的六本期刊&#xff0c;Management Science、Operations Research、Service Science、Tutorials in OR、INFORMS Analytics Collection&#xff0c;以及Transportation Science的新任主编公布&#xff0c;并将于2024年1月1日正式…

基于微信小程序的上门维修评价系统_22c7h-

随着科学研究的不断深入&#xff0c;有关上门维修的各种信息量也在成倍增长。面对庞大的信息量&#xff0c;就需要有上门维修系统来提高管理工作的效率。通过这样的系统&#xff0c;我们可以做到信息的规范管理和快速查询&#xff0c;从而减少了管理方面的工作量。 建立基于微信…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

MyBatis的基本入门及Idea搭建MyBatis坏境且如何一步骤实现增删改查(CRUD)---详细介绍

一&#xff0c;MaBatis是什么&#xff1f; 首先是一个开源的Java持久化框架&#xff0c;它可以帮助开发人员简化数据库访问的过程并提供了一种将SQL语句与Java代码进行解耦的方式&#xff0c;使得开发人员可以更加灵活地进行数据库操作。 1.1 Mabatis 受欢迎的点 MyBatis不仅是…

用于优化开关性能的集成异质结二极管的4H-SiC沟道MOSFET

标题&#xff1a;4H-SiC Trench MOSFET with Integrated Heterojunction Diode for Optimizing Switching Performance 摘要 本研究提出了一种新型的4H-SiC沟道MOSFET&#xff0c;其在栅槽底部集成了异质结二极管&#xff08;HJD-TMOS&#xff09;&#xff0c;并通过TCAD模拟进…

【vim 学习系列文章 5 - cscope 过滤掉某些目录】

文章目录 cscope 过滤目录介绍 cscope 过滤目录介绍 第一步创建自己的cscope脚本~/.local/bin/cscope.sh&#xff0c;如下&#xff1a; function my_cscope() {CODE_PATHpwdecho "$CODE_PATH"echo "start cscope...."if [ ! -f "$CODE_PATH/cscope.…

编织梦想:SpringBoot AOP 教程与自定义日志切面完整实战

什么是 AOP AOP 是指通过预编译方式和运行期动态代理的方式&#xff0c;在不修改源代码的情况下对程序进行功能增强的一种技术。AOP 不是面向对象编程&#xff08;OOP&#xff09;的替代品&#xff0c;而是 OOP 的补充和扩展。它是一个新的维度&#xff0c;用来表达横切问题&a…

STM32 中断复习

中断 打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断。 在确定时间内对相应事件作出响应&#xff0c;如&#xff1a;温度监控&#xff08;定时器中断&#xff09;。故障处理&#xff0c;检测到故障&#x…

用python从零开始做一个最简单的小说爬虫带GUI界面(1/3)

目录 前言 三节博客内容概要 PyQt5的配置 设置软件的快捷启动方式 1. 用于设计界面的程序 2. 将Qt Designer设计出来的ui文件转化为py文件 3. 可以把py文件打包成可执行的exe文件 4. 将ico图片放在qrc文件中&#xff0c;再将qrc文件转换成py…

SpringBoot中properties、yml、yaml的优先级

原理 配置优先级低的会先加载然后会被配置优先级高的覆盖 验证 创建SpringBoot项目&#xff08;网址&#xff09; 在resource目录下创建application.properties、application.yml、application.yaml文件 运行 结论 优先级顺序&#xff1a; properties>yml>yaml

安防监控视频云存储平台EasyNVR出现内核报错的情况该如何解决?

安防视频监控汇聚EasyNVR视频集中存储平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。 近期有用户联系到我们&#xff0c;EasyNVR…

Shell语法揭秘:深入探讨常见Linux Shell之间的语法转换

深入探讨常见Linux Shell之间的语法转换 一、引言二、Linux常用Shell&#xff1a;Bash、Zsh、Ksh、Csh、Tcsh和Fish的简介2.1、Bash、Zsh、Ksh、Csh、Tcsh和Fish的特点和用途2.2、语法差异是常见Shell之间的主要区别 三、变量和环境设置的语法差异3.1、变量定义和使用的不同语法…

MAC钓鱼并Root权限上线CS并权限维持,以及所有的坑如何解决

本文转载于&#xff1a;https://www.freebuf.com/articles/web/350592.html 作者&#xff1a;文鸯涂鸦智能安全实验室 制作MAC 一、下载工具 首先从github上下载CrossC2。链接&#xff1a;https://github.com/gloxec/CrossC2/releases/tag/v3.1.0。 根据你CS客户端的操作系统选…

Linux内核学习(六)—— 中断(基于Linux 2.6内核)

一、中断 中断使得硬件得以发出通知给处理器。中断随时都可以产生&#xff0c;如键盘敲击就会触发中断&#xff0c;通知操作系统有按键按下。 不同设备对应的中断不同&#xff0c;而每个中断都通过一个唯一的数字标识。这些中断值通常被称为中断请求&#xff08;IRQ&#xff…

Dockerfile制作镜像与搭建LAMP环境

1、编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。 具体要求如下&#xff1a; &#xff08;1&#xff09;基于centos基础镜像&#xff1b; &#xff08;2&#xff09;指定作者信息&#xff1b; &#xff08;3&#x…

VMware虚拟机Ubuntu无法连接网络的解决方法

一、解决办法 网络适配器设置 终端依次执行下面命令即可 sudo nmcli networking off sudo nmcli networking onsudo service network-manager start #或者 sudo service NetworkManager start成功出现这个图标&#xff0c;即代表网络连接成功。

AveMaria 传播手段的变化

AveMaria 是一种最早在 2018 年 12 月出现的窃密木马&#xff0c;攻击者越来越喜欢使用其进行攻击&#xff0c;运营方也一直在持续更新和升级。在过去六个月中&#xff0c;研究人员观察到 AveMaria 的传播手段发生了许多变化。 2022 年 12 月攻击行动 研究人员发现了名为 .Vh…

Linux中shell脚本——for、while循环及脚本练习

目录 一.for循环 1.1.基本格式 1.2.类C语言格式 二.while循环 2.1.基本格式 2.2.死循环语句 三.跳出循环 3.1.continue跳出循环 3.2.break跳出循环 四.常用循环 4.1.循环打印九九乘法表 4.2.循环ping测试某个网段网络连通性 4.3.while死循环实现猜数字游戏 4.4.数…

Python自动化小技巧18——自动化资产月报(word设置字体表格样式,查找替换文字)

案例背景 每月都要写各种月报&#xff0c;经营管理月报&#xff0c;资产月报.....这些报告文字目标都是高度相似的&#xff0c;只是需要替换为每个月的实际数据就行&#xff0c;如下&#xff1a; (打码是怕信息泄露.....) 可以看到&#xff0c;这个报告的都是高度模板化&…

Linux 线程安全

一、线程安全的概念 线程安全即就是在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 二、如何保证线程安全 1.线程同步 保证同一时刻只有一个线程访问临界资源。线程同步的方法有4种&#xf…