当前位置: 首页 > news >正文

让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片

🌈 场景概述

java 小伙伴相信都使用 EasyExcel 以及 POI 库实现过 Excel 批量导入、导出功能,但只有部分人实现过 excel 导入带图片数据的场景。这个技术实现手段网上也有很多案例和demo,最常见的就是通过 XSSFPictureData 来实现。但是在 WPS 单元格嵌入图片场景下,本法无效。

本文讲解:如何利用 AI 在5分钟内实现用 Java EasyExcel 针对 WPS Excel 单元格嵌入图片的读取。

🎯 本节你将学到:

  • 什么?凡是用过电脑的人99%都会数据库?
  • Excel 真的是你平时见到的那个样子么?
  • 用 AI 5分钟搞定Java EasyExcel 针对 WPS Excel 单元格嵌入图片的读取。

👇 视频版教程

(喜欢看视频教程就看视频,喜欢看图文教程就继续往下滑)

让AI帮我用java实现EasyExel读取图片(支持WPS嵌入图片),AI 5分钟搞定普通程序员5天工作量

👉🏻 笔记原文👉🏻  让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片 · 语雀

1、常规Excel读取图片的问题

最常见的通过 java + easyexcel 实现excel图片读取的方法,基本都是通过Apache POIXSS*方法实现:

import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;// 假设你已经有了一个MultipartFile类型的Excel文件
XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
Map<String, XSSFPictureData> pictures = new HashMap<>();for (XSSFPictureData picture : workbook.getAllPictures()) {pictures.put(picture.getPackagePart().getPartName().getName(), picture);
}// 遍历sheet中的所有形状,找到图片并处理
for (POIXMLDocumentPart dr : sheet.getRelations()) {if (dr instanceof XSSFDrawing) {XSSFDrawing drawing = (XSSFDrawing) dr;for (XSSFShape shape : drawing.getShapes()) {if (shape instanceof XSSFPicture) {XSSFPicture picture = (XSSFPicture) shape;XSSFPictureData picData = pictures.get(picture.getPackagePart().getPartName().getName());// 处理图片数据,例如保存到服务器或数据库}}}
}

但是,本法对于 WPS 内嵌图片无效,因为 WPS 内嵌图片使用了 DISPIMG函数,我们用上面的方法解析后,得到的只是函数信息,并非图片信息。如下图的 =DISPIMG("ID_79A9B2935BEA4B1B8836ECE25C09D573",1)

2、揭开 Excel 的神秘面纱

🧑‍🎓 你以为的Excel 🆚 真实的Excel

你以为的Excel

真实的Excel

📚 这里要讲一个知识,就是 Excel 可以被理解为一种简单的数据库

因为它具有存储和组织数据的能力,并且可以通过公式、查询和宏等功能来处理数据。以下是一些将 Excel 视为数据库的理由:

  1. 数据存储:Excel 文件(.xlsx 或 .xls)可以存储大量的数据,类似于数据库中的表。
  2. 表格结构:Excel 中的工作表类似于数据库中的表,它们都有行和列的结构。
  3. 数据操作:Excel 提供了排序、筛选和查找等基本的数据操作功能,这些也是数据库管理系统(DBMS)中常见的操作。
  4. 数据查询:Excel 允许使用公式和函数(如 VLOOKUP、HLOOKUP、INDEX 和 MATCH)来查询和分析数据。
  5. 数据验证:Excel 提供数据验证功能,可以限制输入的数据类型,类似于数据库中的数据完整性约束。
  6. 宏和自动化:Excel 的宏功能可以用来自动化重复性的数据操作任务,类似于数据库中的存储过程和触发器。

然而,尽管 Excel 具有这些数据库的特性,它也有一些限制,使其不适合作为大型或复杂的数据库解决方案:

  1. 性能问题:对于大型数据集,Excel 的性能可能会下降,因为它不是为处理大规模数据而设计的。
  2. 数据安全和权限管理:Excel 在数据安全和权限管理方面不如专业的数据库管理系统强大。
  3. 数据一致性和完整性:Excel 缺乏数据库管理系统中的数据一致性和完整性约束。
  4. 多用户访问:Excel 文件通常不适合多用户同时访问和编辑,而数据库管理系统支持多用户并发访问。
  5. 扩展性和可伸缩性:随着数据量的增长,Excel 的扩展性和可伸缩性不如专业的数据库系统。

因此,虽然 Excel 可以被视为一种数据库,但它更适合于小型、简单的数据管理和分析任务。对于需要高性能、高安全性、复杂查询和大规模数据处理的场景,专业的数据库管理系统(如 MySQL、PostgreSQL、Oracle 等)会是更合适的选择。

前面我们截图中的“真实的Excel”是怎么回事?

其实很简单:

我们将 WPS 创建的.xlsx文件后缀名改为.zip后解压缩文件,得到的就是这个效果。

3、EasyExcel 读取WPS内嵌图片如何解决

3.1 先来找到图片位置以及绑定方式

根据前面的分析,我们可以看到 wps 的内嵌图片是通过DISPIMG函数加载的,同时我们通过 Excel 神秘面纱中看到了其“Excel 数据的底层文件构造”,接下来我们找到这个函数与图片之间的逻辑关系,然后通过代码找到这个图片就行了。

  • 文件:/xl/cellimages.xml

  • 文件:/xl/_rels/cellimages.xml.rels

  • 最后找到图片

3.2 让AI帮助我们用java实现

  • 首先打开领航AGI聚合平台:领航AGI
  • 点击 playground 进入 AI 工具
  • 输入提示要求(第一次没有提到wps问题,所以生成的代码仍存在问题,这里不做演示,直接下一步)

  • 告诉他wps内嵌图片问题,并把文件xml给AI

AI完整对话内容(点击查看全部)

3.3 看最终代码

这里面我后来把文件名称调整了下,方便后期大家检索

WPSExcelImportImgListener.java

package com.sinosoft.hanlin.jyy.handler;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.sinosoft.hanlin.jyy.core.vo.common.WPSExcelImportImgDemoVo;
import lombok.Getter;import java.util.ArrayList;
import java.util.List;/*** @author 微信 LHYYH0001* @description: Excel带图片导入* 处理图片与数据行的关联。由于图片的对应顺序已在 ExcelImageExtractor 中提供,这里可以通过行号进行匹配。* @create 2024-11-05 09:07**/
@Getter
public class WPSExcelImportImgListener extends AnalysisEventListener<WPSExcelImportImgDemoVo> {private List<WPSExcelImportImgDemoVo> dataList = new ArrayList<>();@Overridepublic void invoke(WPSExcelImportImgDemoVo data, AnalysisContext context) {// 处理每一行的数据dataList.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 所有数据解析完成后执行}
}

WPSExcelImportImgDemoVo.java

package com.sinosoft.hanlin.jyy.core.vo.common;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class WPSExcelImportImgDemoVo {@ExcelProperty("标题")private String title;//    // 将图片字段设置为 List<ImageData> 类型,用于接收多张图片
//    @ExcelProperty(value = "图片")
//    private List<ImageData> picture;@ExcelProperty(value = "图片")private String picture;
}

WPSExcelImportImgExtractor.java

package com.sinosoft.hanlin.jyy.handler;import org.apache.commons.io.IOUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;public class WPSExcelImportImgExtractor {/*** 提取 Excel 中的图片,并返回单元格与图片路径的映射* <p>* WPS 的内置函数无法提取图片,需要使用第三方库解析XML文件。* WPS 内嵌图片会把图片做DISPIMG函数处理,如=DISPIMG("ID_9D6E8C240C8945178DFF238232B217BF",1)* 我们可以将.xlsx 文件后缀改成.zip后解压,即可看到* 在xl路径下的cellimages.xml文件中,可以看到函数中的id值* 并且在cellimages.xml.rels中可以看到函数与图片之间的关系,而图片就位于xl/media路径下** @param inputStream Excel 文件的输入流* @param outputDir   图片保存的目标目录* @return 单元格位置(如 A1)与图片路径的映射* @throws Exception 异常*/public Map<String, String> extractImages(InputStream inputStream, String outputDir) throws Exception {Map<String, String> cellImageMap = new HashMap<>();Map<String, String> relsMap = new HashMap<>();Map<String, byte[]> imagesData = new HashMap<>();// 创建目标目录File dir = new File(outputDir);if (!dir.exists()) {dir.mkdirs();}ZipInputStream zis = new ZipInputStream(inputStream);ZipEntry zipEntry;ByteArrayOutputStream baos = null;String sheetXml = null;String cellImagesXml = null;String cellImagesRelsXml = null;// 首先遍历所有的Zip条目,找到需要的XML和图片文件while ((zipEntry = zis.getNextEntry()) != null) {String entryName = zipEntry.getName();if ("xl/cellimages.xml".equals(entryName)) {baos = new ByteArrayOutputStream();IOUtils.copy(zis, baos);cellImagesXml = baos.toString("UTF-8");baos.close();} else if ("xl/_rels/cellimages.xml.rels".equals(entryName)) {baos = new ByteArrayOutputStream();IOUtils.copy(zis, baos);cellImagesRelsXml = baos.toString("UTF-8");baos.close();} else if (entryName.startsWith("xl/media/")) {byte[] imageBytes = IOUtils.toByteArray(zis);String imageName = entryName.substring("xl/media/".length());imagesData.put(imageName, imageBytes);}zis.closeEntry();}zis.close();// 解析cellimages.xml.rels,建立rId到图片文件名的映射if (cellImagesRelsXml != null) {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document relsDoc = builder.parse(new ByteArrayInputStream(cellImagesRelsXml.getBytes("UTF-8")));NodeList relNodes = relsDoc.getElementsByTagName("Relationship");for (int i = 0; i < relNodes.getLength(); i++) {Element relElement = (Element) relNodes.item(i);String rId = relElement.getAttribute("Id");// e.g., "media/image1.png"String target = relElement.getAttribute("Target");relsMap.put(rId, target.substring("media/".length()));}}// 解析cellimages.xml,提取图片与单元格的关系if (cellImagesXml != null) {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document cellImagesDoc = builder.parse(new ByteArrayInputStream(cellImagesXml.getBytes("UTF-8")));NodeList cellImageNodes = cellImagesDoc.getElementsByTagName("etc:cellImage");for (int i = 0; i < cellImageNodes.getLength(); i++) {Element cellImageElement = (Element) cellImageNodes.item(i);// 获取图片 name 属性,如 "ID_6C483737A6AC427DAA4E4974252FB8A8"Element picElement = (Element) cellImageElement.getElementsByTagName("xdr:pic").item(0);Element cNvPr = (Element) picElement.getElementsByTagName("xdr:cNvPr").item(0);// e.g., "ID_6C483737A6AC427DAA4E4974252FB8A8"String imageName = cNvPr.getAttribute("name");// 获取 r:embed 属性,如 "rId1"Element blipFill = (Element) picElement.getElementsByTagName("xdr:blipFill").item(0);Element blip = (Element) blipFill.getElementsByTagName("a:blip").item(0);// e.g., "rId1"String rId = blip.getAttribute("r:embed");// e.g., "image1.png"String imageFileName = relsMap.get(rId);// TODO: 根据需要确定图片对应的单元格位置// 由于cellimages.xml中没有直接包含单元格位置的信息,这里需要通过其他途径获取// 例如,可以通过图片的位置信息(如x, y坐标)与单元格的位置对应// 但是这需要解析更多的XML信息,这里假设图片对应的顺序与数据行对应// 保存图片到本地byte[] imageBytes = imagesData.get(imageFileName);if (imageBytes != null) {String savedImagePath = outputDir + File.separator + imageFileName;FileOutputStream fos = new FileOutputStream(savedImagePath);fos.write(imageBytes);fos.close();// 由于缺少单元格位置信息,这里需要自定义逻辑进行映射// 例如,可以将图片顺序与数据行顺序对应// 这里将图片名存储到一个列表中,后续与数据行进行关联cellImageMap.put(imageName, savedImagePath);}}}return cellImageMap;}
}

ImportImgDemoApi.java

// ImportImgDemoApi.java
package com.sinosoft.hanlin.jyy.core.api;import com.alibaba.excel.EasyExcel;
import com.sinosoft.hanlin.jyy.annotation.NoAuth;
import com.sinosoft.hanlin.jyy.core.vo.common.WPSExcelImportImgDemoVo;
import com.sinosoft.hanlin.jyy.handler.WPSExcelImportImgExtractor;
import com.sinosoft.hanlin.jyy.handler.WPSExcelImportImgListener;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
import java.util.Map;/*** 数据+图片导入*/
@Slf4j
@RestController
@RequestMapping("/easy")
public class ImportImgDemoApi {/*** 从输入流中读取 Excel 文件并解析数据,包括图片* @author 微信 LHYYH0001** @param filePath Excel 文件* @return 包含解析后数据的列表*/@ApiOperation(value = "Excel导入带图片demo", notes = "Excel导入带图片demo", produces = MediaType.APPLICATION_JSON_VALUE)@PostMapping(value = "/import", produces = MediaType.APPLICATION_JSON_VALUE)@NoAuthpublic List<WPSExcelImportImgDemoVo> importExcel(@RequestParam("filePath") MultipartFile filePath, HttpServletResponse httpServletResponse) throws Exception {// 创建监听器WPSExcelImportImgListener listener = new WPSExcelImportImgListener();// 获取文件输入流InputStream inputStreamForData = filePath.getInputStream();// 使用 EasyExcel 读取数据EasyExcel.read(inputStreamForData, WPSExcelImportImgDemoVo.class, listener).sheet().doRead();List<WPSExcelImportImgDemoVo> dataList = listener.getDataList();// 重置输入流以供图片提取InputStream inputStreamForImages = filePath.getInputStream();// 提取图片并保存WPSExcelImportImgExtractor extractor = new WPSExcelImportImgExtractor();// 修改为您希望保存图片的目录String imageOutputDir = "/Users/javastarboy/Desktop/京东自营/";Map<String, String> cellImageMap = extractor.extractImages(inputStreamForImages, imageOutputDir);// 遍历数据并关联图片// 假设图片的顺序与数据行的顺序一致int imageIndex = 0;for (int i = 0; i < dataList.size(); i++) {WPSExcelImportImgDemoVo vo = dataList.get(i);// 获取对应的图片String imagePath = null;if (i < cellImageMap.size()) {imagePath = (String) cellImageMap.values().toArray()[i];// 将图片路径设置到实体类vo.setPicture(imagePath);log.info("图片 {} 已关联到标题 {}", imagePath, vo.getTitle());}}// 关闭输入流inputStreamForImages.close();// 返回数据列表return dataList;}
}

验证一下

请求后,excel的图片会存储在 imageOutputDir路径下。

存储逻辑可以根据你的业务逻辑做对应调整,上面imageOutputDir只是demo演示

分享不易,点赞、关注,支持下哦~ 

相关文章:

让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片

&#x1f308; 场景概述 java 小伙伴相信都使用 EasyExcel 以及 POI 库实现过 Excel 批量导入、导出功能&#xff0c;但只有部分人实现过 excel 导入带图片数据的场景。这个技术实现手段网上也有很多案例和demo&#xff0c;最常见的就是通过 XSSFPictureData 来实现。但是在 W…...

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…...

深度学习之卷积问题

1 卷积在图像中有什么直观作用 ​ 在卷积神经网络中&#xff0c;卷积常用来提取图像的特征&#xff0c;但不同层次的卷积操作提取到的特征类型是不相同的&#xff0c;特征类型粗分如表1所示。 ​ 表1 卷积提取的特征类型 卷积层次特征类型浅层卷积边缘特征中层卷积局部特征深…...

yum安装zabbix5.0升级php到74的办法

【背景】 公司时不时有扫描漏洞,之前发现了php漏洞,因开启防火墙,限定IP+端口,暂时躲过升级;现在,老话重提,开启了KPI考核,躲是躲不过去的了,升级吧 【难题】 服务器为centos7,因操作系统问题,只能安装zabbix5.0。当时图省力,官网的办法,都是yum安装,很是简便。…...

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…...

当AI遇上时尚:未来的衣橱会由机器人来打理吗?

内容概要 在当今这个快速发展的时代&#xff0c;人工智能与时尚的结合正在逐渐改写我们对衣橱管理的认知。传统的衣橱管理常常面临着空间不足、穿搭单调及库存过多等挑战&#xff0c;许多人在挑选服饰时难以做出决策。然而&#xff0c;随着技术的进步&#xff0c;智能推荐和自…...

【初阶数据结构篇】二叉树OJ题

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…...

Windows系统中Oracle VM VirtualBox的安装

一.背景 公司安排了师带徒&#xff0c;环境搭建问题一直是初级程序员头疼的事情&#xff0c;我记录一下这些基础的内容&#xff0c;方便初学者。大部分开发者的机器还是windows系统&#xff0c;所以写了怎么安装。 二.版本信息及 操作系统&#xff1a;windows11 家庭版…...

go语言使用总结(持续更新)

整理后的内容如下&#xff1a; 1. 先了解函数签名&#xff0c;再了解传入参数以及调用 函数签名是函数的声明部分&#xff0c;包括函数名、参数列表和返回值列表。理解函数签名是理解函数行为的第一步&#xff0c;尤其是在了解参数类型、参数数量和返回值类型等方面。通过了解…...

如何在Android中自定义property

在Android中创建自定义的属性&#xff08;Android property&#xff09;通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤&#xff1a; 1. 定义属性 在Android中&#xff0c;属性是以“属性名称属性值”形式定义的键值对…...

机器学习5_支持向量机_原问题和对偶问题——MOOC

目录 原问题与对偶问题的定义 定义该原问题的对偶问题如下 在定义了函数 的基础上&#xff0c;对偶问题如下&#xff1a; 综合原问题和对偶问题的定义得到&#xff1a; 定理一 对偶差距&#xff08;Duality Gap&#xff09; 强对偶定理&#xff08;Strong Duality Theo…...

索引的细节

目录 什么是线性 搜索算法&#xff1f; 算法&#xff1a;二进制搜索算法 二进制搜索如何工作&#xff1f; 什么是二叉排序树&#xff1f; 构建二叉排序树 什么是AVL树&#xff1f; AVL树的性能分析 什么是线性 搜索算法&#xff1f; 线性搜索是一种非常简单的搜索算法。在…...

LeetCode 540.有序数组中的单一元素

思路一&#xff1a;hash&#xff0c;键存入元素&#xff0c;值存入次数&#xff0c;然后遍历&#xff0c;不是最优解 思路二&#xff1a;二分查找 假设数组为 [1, 1, 2, 2, 3, 4, 4]&#xff0c;其中唯一出现一次的元素是 3。在一个有序数组中&#xff0c;如果没有唯一的元素&…...

【图文】【DIY便签】如何自行编译OPENCV使用动态库

1 去官网下载安装包和源码 下面红色圈中的是源码&#xff0c;绿色圈中的是安装包&#xff1a; 2 配置工具链 安装过程不说了&#xff0c;教程到处都是。编译的话使用CMAKE&#xff0c;配置如下&#xff1a; 上面两个路径分别是&#xff1a; 源码目录编译生成的文件放置的位…...

WordPress文章自动提交Bing搜索引擎:PHP推送脚本教程

随着网站SEO优化的重要性日益增加,将新发布的内容快速提交到搜索引擎显得尤为重要。尤其对于Bing站长平台,自动化推送能让Bing尽快发现和索引我们网站的新内容。本文将详细介绍如何通过PHP脚本自动推送WordPress当天发布的文章至Bing站长平台,确保新文章被Bing及时收录。 前…...

C++题目分享

嗨嗨嗨&#xff0c;我又来更新这个系列了&#xff0c;很久没更新了。让我们看一看有那些有趣的题目&#xff1a; 题目一&#xff1a; 1.以单链表作为存储结构&#xff0c;实现线性表的就地逆置&#xff08;提示&#xff0c;就地逆置&#xff1a;在不使用额外的数据结构或空间…...

【Spring 框架】初识 Spring

文章目录 前言1. 什么是 Spring2. 什么是 Maven3. 第一个 SpringBoot 项目4. 项目讲解结语 前言 在前面我们一起学习了 JavaSE 的基础知识&#xff0c;随着学习的深入&#xff0c;我们也将逐步介绍 JavaEE 的内容&#xff0c;像 Spring 框架&#xff0c;Mybatis 等等。在本篇博…...

链表(Linkedlist)

序言 我们都了解链表是一种数据的存储结构&#xff0c;在Java使用中逻辑与c&#xff0c;c语言数据结构别无二致&#xff0c;但主要由于Java中不存在指针的说法&#xff0c;从而导致在实现过程中的代码不同&#xff0c;所以在学习的过程中我们无需过于担心&#xff0c;逻辑都是…...

信息安全工程师(79)网络安全测评概况

一、定义与目的 网络安全测评是指参照一定的标准规范要求&#xff0c;通过一系列的技术、管理方法&#xff0c;获取评估对象的网络安全状况信息&#xff0c;并对其给出相应的网络安全情况综合判定。其对象主要为信息系统的组成要素或信息系统自身。网络安全测评的目的是为了提高…...

保研考研机试攻略:python笔记(3)

&#x1f428;&#x1f428;&#x1f428;11sort 与 sorted 区别 sort 是应用在 list 上的方法&#xff0c;sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作&#xff0c; 无返回值&#xff0c;而内建函数 sorted 方法返回的…...

刘卫国MATLAB程序设计与应用课后答案PDF第三版

刘卫国《MATLAB程序设计与应用》&#xff08;第三版&#xff09;是对普通高等教育“十一五”国家级规划教材《MATLAB程序设计与应用》(第二版)的一次全面修订。全书总体保持第二版原有体系结构&#xff0c;但根据技术发展和应用的需要扩充了许多新内容。全书强调数学方法、算法…...

【鉴权】Web 会话管理:Cookie、Session 和 Token 深度对比

目录 引言一、Cookie二、Session三、Token (JWT)四、总结对比五、Token、Session 和 Cookie 的选择总结 引言 在现代 Web 开发中&#xff0c;Cookie、Session 和 Token 都是用于用户身份验证和状态管理的常见技术。每种技术有其特定的应用场景和优缺点&#xff0c;理解它们之间…...

ArkTS--应用状态

应用状态 应用状态相关的内容需要使用模拟器或真机调试&#xff0c;在API 11开始也支持preview 1.LocalStorage LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收参数可以在页面内共享数据 1.1 页面内共享数据 import {MyUser} from ../model/MyUser //用户对…...

yolov8涨点系列之引入CBAM注意力机制

文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化&#xff1a; yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…...

java标准JavaBean类

1. public class test {//属性private String username;private String password;private String email;private String gender;private int age;//快捷键//altinsert//altFninsert//插件PTG1秒生成标准Javabean //插件ptg c//空参public test() {}//全部参数…...

MATLAB界面设计全攻略:从基础入门到高级应用

引言 MATLAB作为一种功能强大的科学计算软件&#xff0c;不仅可以进行各种复杂的数值计算&#xff0c;还可以通过其图形用户界面设计工具&#xff08;GUI&#xff09;为用户提供可视化操作界面。本教程旨在详细介绍MATLAB界面设计的全过程&#xff0c;为初学者提供从入门到精通…...

JavaScript API部分知识点

一、Dom获取&属性操作 &#xff08;一&#xff09;、 Web API 基本认知 1、变量声明 const 声明的值不能更改&#xff0c;而且const声明变量的时候需要里面进行初始化 但是对于引用数据类型&#xff0c;const声明的变量&#xff0c;里面存的不是 值&#xff0c;是 地址…...

钉钉调试微应用整理2

第一步 新建应用 钉钉开放平台](https://open-dev.dingtalk.com/) 去新增应用 第二步 配置应用信息 把本地代码运行起来&#xff0c;并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一&#xff1a; index.html页面中 <!DOCTYPE h…...

C++初级入门(1)

第一部分 基础语法入门 一、基础 1、变量与常量 1、变量 变量存在的意义:方便管理内存空间 2、常量 用于记录程序中不可更改的数据 #define 常量名 常量值 const 数据类型 常量名常量值 ; 2、数据类型 1、整型 short 2字节 int 4字节 long Wi…...

group_concat配置影响程序出bug

在 ThinkPHP 5 中&#xff0c;想要临时修改 MySQL 数据库的 group_concat_max_len 参数&#xff0c;可以使用 原生 SQL 执行 来修改该值。你可以通过 Db 类来执行 SQL 语句&#xff0c;从而修改会话&#xff08;Session&#xff09;级别的变量。 步骤 设置 group_concat_max_l…...

小程序 wordpress打包/深圳网络推广收费标准

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/886/C 解题思路&#xff1a; 想到类似dp的思路&#xff0c;用cnt[fa]记录父节点不包括自身的回文子串总数&#xff0c;那么 当前的总数可以分为3部分 cnt[now] cnt[fa] 1(父节点本身) 当前在父节点串两边新添…...

wordpress 登录小工具/seo建站系统

Linux系统为每一个进程维护一个单独的地址空间&#xff0c;包含了进程的内存分区即&#xff1a;代码段、数据、运行时堆栈&#xff0c;共享库等部分。 【实验与演示】 堆与全局变量的比较&#xff1a; struct A {char ch;int n; }; A a; A b; int main() {A* ptrnew A;cout&…...

成都科技网站建设联系/重庆百度快照优化

1. 前言 自1994年由爱立信推出至今&#xff0c;蓝牙技术已经走过了20个岁月。从最初的Bluetooth V1.0&#xff0c;到Bluetooth V4.0&#xff08;最新的为V4.1&#xff0c;2013年底发布&#xff09;&#xff0c;经历了近9个版本的修订后&#xff0c;发展为当前的状况。 说实话&a…...

时时彩五星做号网站/简单制作html静态网页

注意&#xff1a; 父pom中一定要写版本号才行&#xff01;&#xff01;&#xff01;&#xff01; 1、< packaging> <packaging>pom</packaging>在父级项目中的pom.xml文件使用的packaging配置一定为pom。父级的pom文件只作项目的子模块的整合&#xff0c;在…...

环保网站可以做哪些内容/手机系统优化

Jenkins Docker 1. CI/CD概述与流程 2. 部署Git代码版本仓库并上传Java项目源代码 3. 部署Harbor镜像仓库 4. 部署Docker 5. 部署Jenkins(配置JDK和Maven环境) 6. Jenkins 流水线脚本 7. Jenkins 参数化构建 8. 发布测试...

wordpress网站 添加微信/如何开展网络营销

质数&#xff1a;在大于1的整数中&#xff0c;如果只包含1和本身这两个约数&#xff0c;那么就是素数 试除法&#xff1a; 时间复杂度 O(sqrt(n)) 代码&#xff1a; static boolean prime(int n){if(n < 2) return false;for(int i 2; i < n/i; i){//因为i能被整除&am…...