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

Java后端文件类型检测(防伪造)

在 Spring Boot 项目中,为了防止用户伪造 Content-Type(例如将 .txt 文件改为 image/jpeg 上传),可以通过检查文件的 Magic Number(文件头签名)来验证文件的真实类型。以下是 详细实现步骤 和 完整代码示例


1. 原理说明

  • Magic Number:文件头部的一组特定字节,用于标识文件类型(如 JPEG 的文件头是 FF D8 FF)。

  • 为什么需要MultipartFile.getContentType() 依赖客户端上传的 Content-Type 头,可以被篡改,而文件头是二进制数据,无法伪造。


2. 实现方案

方案一:手动解析文件头(轻量级)

适合简单场景,无需引入额外依赖。

方案二:使用 Apache Tika(推荐)

功能强大,支持 1000+ 文件类型的检测。


方案一:手动解析文件头

(1) 常见文件的 Magic Number
文件类型文件头(Hex)ASCII 表示
JPEGFF D8 FFÿØÿ
PNG89 50 4E 47 0D 0A 1A 0A‰PNG....
GIF47 49 46 38GIF8
(2) 实现工具类 FileHeaderValidator
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;public class FileHeaderValidator {// 定义支持的文件类型及其Magic Numberprivate static final Map<String, byte[]> FILE_TYPE_MAP = new HashMap<>();static {FILE_TYPE_MAP.put("image/jpeg", new byte[]{(byte) 0xFF, (byte) 0xD8, (byte) 0xFF});FILE_TYPE_MAP.put("image/png", new byte[]{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A});}/*** 通过文件头验证文件真实类型*/public static boolean validateFileType(MultipartFile file, String expectedType) throws IOException {byte[] expectedHeader = FILE_TYPE_MAP.get(expectedType);if (expectedHeader == null) {throw new IllegalArgumentException("不支持的目标类型: " + expectedType);}try (InputStream is = file.getInputStream()) {byte[] fileHeader = new byte[expectedHeader.length];if (is.read(fileHeader) != fileHeader.length) {return false;}return Arrays.equals(fileHeader, expectedHeader);}}/*** 自动检测文件真实类型*/public static String detectRealFileType(MultipartFile file) throws IOException {try (InputStream is = file.getInputStream()) {byte[] fileHeader = new byte[8]; // 读取前8字节(足够覆盖常见类型)if (is.read(fileHeader) != fileHeader.length) {return "unknown";}// 检查JPEGif (fileHeader[0] == (byte) 0xFF && fileHeader[1] == (byte) 0xD8 && fileHeader[2] == (byte) 0xFF) {return "image/jpeg";}// 检查PNGif (fileHeader[0] == 0x89 && fileHeader[1] == 0x50 && fileHeader[2] == 0x4E && fileHeader[3] == 0x47 && fileHeader[4] == 0x0D && fileHeader[5] == 0x0A && fileHeader[6] == 0x1A && fileHeader[7] == 0x0A) {return "image/png";}return "unknown";}}
}
(3) 在Controller中使用
@PostMapping("/upload")
public ResponseEntity<String> uploadAvatar(@RequestParam("file") MultipartFile file) {try {// 1. 检查真实类型是否为JPEG或PNGString realType = FileHeaderValidator.detectRealFileType(file);if (!"image/jpeg".equals(realType) && !"image/png".equals(realType)) {return ResponseEntity.badRequest().body("文件真实类型不是JPEG/PNG");}// 2. 检查文件大小if (file.getSize() > 2 * 1024 * 1024) {return ResponseEntity.badRequest().body("文件大小不能超过2MB");}// 3. 保存文件file.transferTo(new File("/tmp/uploads/" + file.getOriginalFilename()));return ResponseEntity.ok("上传成功");} catch (IOException e) {return ResponseEntity.status(500).body("文件处理失败");}
}

方案二:使用 Apache Tika(推荐)

Apache Tika 是一个专业的文件内容检测工具,支持 1000+ 文件类型。

(1) 添加依赖
<dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>2.9.0</version>
</dependency>
(2) 实现类型检测
import org.apache.tika.Tika;
import java.io.IOException;public class TikaFileValidator {private static final Tika tika = new Tika();/*** 检测文件的真实MIME类型*/public static String detectRealFileType(MultipartFile file) throws IOException {return tika.detect(file.getInputStream());}
}
(3) 在Controller中使用
@PostMapping("/upload")
public ResponseEntity<String> uploadAvatar(@RequestParam("file") MultipartFile file) {try {// 1. 使用Tika检测真实类型String realType = TikaFileValidator.detectRealFileType(file);if (!realType.equals("image/jpeg") && !realType.equals("image/png")) {return ResponseEntity.badRequest().body("仅支持JPEG/PNG格式");}// 2. 其他校验逻辑...return ResponseEntity.ok("上传成功");} catch (IOException e) {return ResponseEntity.status(500).body("文件检测失败");}
}

3. 对比两种方案

方案优点缺点适用场景
手动解析文件头无依赖、轻量级需要维护Magic Number,扩展性差仅需支持少量固定类型
Apache Tika支持千种类型,自动更新类型库引入额外依赖需要高可靠性或复杂类型

4. 完整流程

  • 前端:用户通过 <input type="file"> 选择文件。

  • 后端

    • 接收 MultipartFile

    • 通过文件头或 Tika 检测真实类型。

    • 校验类型、大小等。

    • 保存文件或返回错误。


5. 测试案例

// 测试伪造的JPEG文件(实际是.txt)
MockMultipartFile fakeJpeg = new MockMultipartFile("file", "test.jpg", "image/jpeg", "This is a text file".getBytes()
);// 使用Tika检测会返回 "text/plain"
String realType = TikaFileValidator.detectRealFileType(fakeJpeg); 
assert realType.equals("text/plain");

6. 注意事项

  • 性能:文件头检测只需读取前几个字节,速度快;Tika 可能需要更多解析时间。

  • 安全性:即使通过验证,仍需防范恶意文件(如压缩炸弹),建议在保存前扫描。

  • 扩展性:如果需要支持更多类型(如PDF、GIF),Tika 是更好的选择。

相关文章:

Java后端文件类型检测(防伪造)

在 Spring Boot 项目中&#xff0c;为了防止用户伪造 Content-Type&#xff08;例如将 .txt 文件改为 image/jpeg 上传&#xff09;&#xff0c;可以通过检查文件的 Magic Number&#xff08;文件头签名&#xff09;来验证文件的真实类型。以下是 详细实现步骤 和 完整代码示例…...

知名人工智能AI培训公开课内训课程培训师培训老师专家咨询顾问唐兴通AI在金融零售制造业医药服务业创新实践应用

AI赋能未来工作&#xff1a;引爆效率与价值创造的实战营 AI驱动的工作革命&#xff1a;从效率提升到价值共创 培训时长&#xff1a; 本课程不仅是AI工具的操作指南&#xff0c;更是面向未来的工作方式升级罗盘。旨在帮助学员系统掌握AI&#xff08;特别是生成式AI/大语言模型…...

VUE3基础样式调整学习经验

首先创建一个vue项目最好要把不属于自己的样式都删除掉&#xff0c;以面出现css难以调整的情况&#xff1a; 1.assets目录下的main.css、base.css等样式全部删除 2.app.vue下的样式也全部删除 3.使用element plus一定要加入样式包&#xff1a; import element-plus/dist/in…...

AI与IoT携手,精准农业未来已来

AIoT:农业领域的变革先锋 在科技飞速发展的当下,人工智能(AI)与物联网(IoT)的融合 ——AIoT,正逐渐成为推动各行业变革的关键力量,农业领域也不例外。AIoT 技术通过将 AI 的智能分析能力与 IoT 的设备互联能力相结合,为农业生产带来了前所未有的精准度和智能化水平。 …...

物联网驱动的共享充电站系统:智能充电的实现原理与技术解析!

随着新能源汽车的快速普及&#xff0c;共享充电站系统作为其核心基础设施&#xff0c;正通过物联网技术的深度赋能&#xff0c;实现从“传统充电”到“智能充电”的跨越式升级。本文将从系统架构、核心技术、优化策略及实际案例等角度&#xff0c;解析物联网如何驱动共享充电站…...

MCP 入门实战:用 C# 开启 AI 新篇章

MCP 入门实战&#xff1a;用 C# 开启 AI 新篇章 一、什么是 MCP&#xff1f; MCP&#xff0c;全称为 Model Context Protocol&#xff08;模型上下文协议&#xff09;&#xff0c;是一个开放的协议&#xff0c;它为应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下…...

ES常识7:ES8.X集群允许4个 master 节点吗

在 Elasticsearch&#xff08;ES&#xff09;中&#xff0c;4 个 Master 节点的集群可以运行&#xff0c;但存在稳定性风险&#xff0c;且不符合官方推荐的最佳实践。以下从选举机制、故障容错、资源消耗三个维度详细分析&#xff1a; 一、4 个 Master 节点的可行性&#xff1…...

WebRTC:去中心化网络P2P框架解析

在互联网的世界里&#xff0c;数据的传输就像一场永不停歇的 “信息快递”。当我们使用 WebRTC 实现视频通话时&#xff0c;背后支撑的网络框架至关重要。今天&#xff0c;我们将深入探索 WebRTC 开发中视频通话的前置基础 ——P2P&#xff08;点对点&#xff09;框架&#xff…...

Linux 上安装RabbitMQ

&#x1f407; 安装 Erlang/OTP 27.3.4&#xff08;最新稳定版&#xff09; 1. 下载 Erlang 源码 cd /usr/local/src wget https://erlang.org/download/otp_src_27.3.4.tar.gz2. 解压源码 tar -zxvf otp_src_27.3.4.tar.gz cd otp_src_27.3.43. 安装依赖 sudo apt update …...

Service Mesh实战之Istio

Service Mesh&#xff08;服务网格&#xff09;是一种专为微服务架构设计的网络代理层&#xff0c;用于处理服务间的通信、管理和监控。Istio 是一个流行的开源 Service Mesh 实现&#xff0c;通过提供流量管理、观测性和安全性等功能&#xff0c;帮助开发者应对分布式系统的复…...

BGP练习

一、要求拓扑图 二、要求 完成上图内容&#xff0c;要求五台路由器的环回地址均可以相互访问 三、需求分析 1. 网络连通性目标 - 需求明确要求五台路由器&#xff08;AR1 - AR5 &#xff09;的环回地址能够相互访问。环回地址是路由器上用于测试、管理及作为BGP等协议中Ro…...

【Redis】分布式锁的实现

目录 一、本地锁存在的问题 二、redis实现分布式锁原理 三、使用示例 四、锁误删问题 解决思路 获取锁和释放锁代码优化 五、锁释放的原子性问题 解决思路&#xff08;Lua脚本&#xff09; 使用流程 总结 大家好&#xff0c;我是千语。上期给大家讲了使用悲观锁来解决…...

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面&#xff0c;然后建立id写到变量下的template里&#xff0c;id变量写到component里 body{ template&#xff1a; …...

手写 vue 源码 === watch 实现

目录 1. watch 的基本使用 2. watch 的整体架构 3. doWatch 函数的实现 3.1 处理不同类型的监听源 3.2 清理副作用的机制 3.3 创建响应式效果 3.4 初始化执行 3.5 返回停止函数 4. watch 如何基于 ReactiveEffect 实现 4.1 依赖收集过程详解 4.2 更新触发过程详解 …...

STM32核心机制解析:重映射、时间片与系统定时器实战——从理论到呼吸灯开发

知识点1【重映射的概念】 1、引入 默认&#xff1a; **定义&#xff1a;**系统或硬件在未经用户修改时的预设配置或行为 STM32的引脚功能、外设配置、中断向量表等默认由芯片设计或库函数预设。 部分重映射 **定义&#xff1a;**仅修改部分资源或地址的映射关系&#xff…...

【Linux网络编程】HTTPS协议原理

目录 一&#xff0c;HTTPS是什么&#xff1f; 1&#xff0c;什么是加密&#xff1f; 2&#xff0c;为什么需要加密&#xff1f; 3&#xff0c;常见的加密方式 对称加密 非对称加密 4&#xff0c;数据摘要&&数据指纹 二&#xff0c;HTTPS协议加密方案 方案一&a…...

【idea】快捷键ctrl+shift+F(Find in files)不起作用

问题描述 在idea中使用快捷键CtrlShiftF&#xff0c;进行内容的搜索&#xff0c;但是弹不出对话框、或有时候能弹出有时候又弹不出。 原因分析 1.怀疑是缓存问题&#xff1f;--清空缓存重启也没什么作用 2.怀疑是idea的问题&#xff1f;--有时行、有时不行&#xff0c;而且…...

「光域」系列激光测距传感器:以光为尺,重构空间认知边界

在150米深的地下矿井中&#xff0c;无人矿卡需要精准识别前方3厘米的落石&#xff1b;在千米高空的风电塔筒检测现场&#xff0c;工程师手持设备要穿透50米雾霭锁定0.1毫米的形变&#xff1b;在智能仓储的立体库房里&#xff0c;穿梭车需在0.3秒内完成货架间距的毫米级校准………...

http和https的区别

HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;超文本传输安全协议&#xff09;是互联网上用于传输数据的两种协议&#xff0c;它们的主要区别如下&#xff1a; 1. 安全性 HTTP&#xff1a;明文传输&#xff0c;数据在传输过程中不加密&#xff0c;容易被窃…...

Dapp开发-如何开发一个dapp

DApp开发全流程指南&#xff1a;从需求到落地的技术实践与生态构建 ——2025年去中心化应用开发方法论与未来趋势解析 一、需求定位与架构设计&#xff1a;构建DApp的技术地基 需求精准定位 功能定义&#xff1a;明确DApp的核心场景&#xff08;如DeFi借贷、NFT交易、DAO治理&…...

Python邮件处理(使用imaplib和email库实现自动化邮件处理)

在日常工作中&#xff0c;我们经常需要自动化处理电子邮件&#xff0c;比如自动下载附件、解析邮件内容、处理特定格式的数据等。本文将通过一个实际案例&#xff0c;详细介绍如何使用Python的imaplib和email库来实现邮件的自动化处理。 目录 环境准备与库介绍IMAP邮件服务器连…...

时空注意力机制深度解析:理论、技术与应用全景

时空注意力机制作为深度学习领域的关键技术&#xff0c;通过捕捉数据在时间和空间维度上的依赖关系&#xff0c;显著提升了时序数据处理和时空建模能力。本文从理论起源、数学建模、网络架构、工程实现到行业应用&#xff0c;系统拆解时空注意力机制的核心原理&#xff0c;涵盖…...

鸿蒙 UIAbility组件与UI的数据同步和窗口关闭

使用 EventHub 进行数据通信 根据 Stage 模型概念图 UIAbility 先于 ArkUI Page 创建 所以&#xff0c;事件要先 .on 订阅 再 emit 发布 假如现在有页面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, launchParam: Ability…...

UI-TARS: 基于视觉语言模型的多模式代理

GitHub&#xff1a;https://github.com/bytedance/UI-TARS 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 基于视觉语言模型&#xff08;Vision-Language Model&#xff09;的 GUI 代理应用&#xff0c;允许用户通过自然语言控制电脑操…...

C++多态讲解

1. 多态的概念 通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态就是函数重载和函数模板&#xff0c;他们传不同的类型的参数就可以调用不同的函数&#xff0c;通过参数的不同达到多种形态&#xff0c;之所以叫编译时多态&…...

QuecPython+蜂窝模组基础开发

开发准备 硬件&#xff1a; 一块 QuecPython_EC2X_EVB 开发板 (以该开发板为例&#xff0c;更多开发板介绍参见下文开发板列表)USB 数据线 (USB-A TO USB-C)PC (Windows10) 蜂窝模组开发板列表: EC2X_EVBEC600X_EVBEC800X_EVBEC600X/EC800X_CORE_EVBBG95_EVBEC200X_EVBEG91…...

-MAC桢-

MAC桢和IP的关系&#xff1a; 主机A想跨网络和B通信需要IP地址进行路由选择&#xff0c;但一个局域网&#xff0c;比如路由器进行路由选择之前&#xff0c;首先要将数据包发送给路由器B&#xff0c;也就是局域网通信也就是同一个网段的主机进行通信&#xff0c;所以必须通过mac…...

反转链表 - 简单

************* C topic: 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; ************* Give the topic an inspection. It seems really easy. At very first, I think that I will use reverse cammand to kill this topic. But a few seconds later I found that…...

负载均衡 ELB 在 zkmall开源商城高流量场景下的算法优化

在电商大促、直播带货等高频交易场景下&#xff0c;流量突发增长对系统稳定性提出严峻挑战。ZKmll 开源商城通过对负载均衡 ELB&#xff08;Elastic Load Balancer&#xff09;算法的深度优化&#xff0c;结合业务场景特性设计动态加权轮询 地域感知 热点分流的混合策略&…...

YOLOv5推理代码解析

代码如下 import cv2 import numpy as np import onnxruntime as ort import time import random# 画一个检测框 def plot_one_box(x, img, colorNone, labelNone, line_thicknessNone):"""description: 在图像上绘制一个矩形框。param:x: 框的坐标 [x1, y1, x…...

创建三个网络,分别使用RIP、OSPF、静态,并每个网络10个电脑。使用DHCP分配IP

DHCP 自动分配IP&#xff0c;集中管理&#xff0c;提高效率 在路由器中设置 Router>en Router#conf t Router(config)#ip dhcp pool ip30 //创建DHCP地址池 Router(dhcp-config)#network 192.168.30.0 255.255.255.0 // 配置网络地址和子网掩码 Router(dhcp-config)#defa…...

[网络层]网络层设备路由器

路由表 路由器能进行路由转发&#xff0c;所依靠的核心数据结构就是路由表&#xff0c;那么路由表是怎么来的&#xff0c; 静态路由和动态路由&#xff1a; 说的是表项&#xff0c;这个表项是静态的还是动态的&#xff0c;就跟ARP缓存表的表项静态动态是一回事&#xff0c; …...

Maven 项目中将本地依赖库打包到最终的 JAR 中

文章目录 前言详细步骤 前言 在现代后端开发中&#xff0c;构建高效且可扩展的 Web 应用程序通常依赖于多种第三方库和内部依赖。这些依赖可以来自公共仓库&#xff0c;也可能是公司内部自研的库或尚未发布到公共仓库的 JAR 包。本文将详细介绍如何在 Maven 项目中处理本地依赖…...

大模型的Lora如何训练?

大模型LoRA(Low-Rank Adaptation)训练是一种参数高效的微调方法,通过冻结预训练模型权重并引入低秩矩阵实现轻量化调整。以下是涵盖原理、数据准备、工具、参数设置及优化的全流程指南: 一、LoRA的核心原理 低秩矩阵分解 在原始权重矩阵$ W 旁添加两个低秩矩阵 旁添加两个…...

CSS3 伪类和使用场景

CSS3 伪类&#xff08;Pseudo-classes&#xff09;大全 CSS3 引入了许多新的伪类&#xff0c;以下是完整的 CSS3 伪类分类列表&#xff08;包括 CSS2 的伪类&#xff09;&#xff1a; 一、结构性伪类&#xff08;Structural Pseudo-classes&#xff09; 这些伪类根据元素在文…...

GitDiagram - GitHub 仓库可视化工具

GitDiagram - GitHub 仓库可视化工具 项目链接&#xff1a;https://github.com/ahmedkhaleel2004/gitdiagram 将任何 GitHub 仓库转换为交互式架构图&#xff0c;只需替换 URL 中的 hub 为 diagram。 ✨ 核心功能 即时可视化&#xff1a;将代码库结构转换为系统设计/架构图…...

[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)

本文将基于langgraph框架&#xff0c;用LLM查询NEO4J图数据库&#xff0c;构建可定制、能应对复杂场景的工作流&#xff01; &#x1f31f; 核心亮点 是否用户提问是否电影相关?生成Cypher查询直接回答执行查询生成最终答案 &#x1f9e9; 模块化实现 1️⃣ 定义状态机 from …...

Python中操作Neo4j图数据库

在当今数据驱动的时代&#xff0c;关系型数据库在处理高度关联的数据时常常显得力不从心。图数据库&#xff0c;尤其是Neo4j&#xff0c;以其独特的图结构和高效的关系查询能力&#xff0c;成为了解决这一问题的利器。结合Python的简洁与强大&#xff0c;我们可以更高效地构建和…...

人工智能时代:解锁职业新身份,从“认证师”到“工程师”的进阶之路

在人工智能技术浪潮席卷全球的今天,技术的飞速迭代正在重塑职业版图。从算法优化到伦理决策,从系统测试到应用开发,AI技术不再只是程序员的专属领域,而是成为各行各业从业者必须掌握的“生存技能”。当企业争相布局AI赛道,个人如何在这场变革中抢占先机?答案或许藏在两个…...

浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差

浙江大学DeepSeek系列公开课第三季重磅开启&#xff0c;特邀该校多领域权威学者联袂主讲。课程聚焦AI技术如何重构基础学科研究范式&#xff0c;深度解码以DeepSeek为代表的智能模型在交叉学科中的创新应用。在"XAI"融合浪潮下&#xff0c;学术大咖将剖析传统学科与人…...

企业级商城系统容器化部署技术方案

容器化部署已成为企业级商城系统构建高可用、弹性架构的核心技术。结合行业实践与技术趋势&#xff0c;以下从架构设计、工具链选型、关键挑战及解决方案等维度&#xff0c;提供一套完整的实施技术方案&#xff1a; 一、架构设计与技术选型 微服务架构拆分 服务拆分原则&#x…...

Java设计模式之适配器模式:从入门到精通

适配器模式(Adapter Pattern)是Java中最常用的结构型设计模式之一,它像一座桥梁连接两个不兼容的接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。本文将全面深入地解析适配器模式,从基础概念到高级应用,包含丰富的代码示例、详细注释、使用场景分析以及多维对…...

Spark,RDD中的转换算子

RDD中的转换算子 map算子 对数字1-10进行乘除&#xff0c;*2 filter算子 对数字1-10进行过滤&#xff0c;过滤出偶数 filatMap算子 对单词进行拆分 reduceByKey算子 对具有相同键的所有值进行聚合操作 统计词频词频统计简洁写法 ———————————————— 版权声明…...

牛客周赛 Round 92(再现京津冀蓝桥杯???)

1. 小红的签到题 现在小红希望你写出一个长度为 nnn 的、使用了下划线命名法命名的变量。为了显出特征&#xff0c;请保证该变量至少由两个单词组成。 输入描述: 输入一个正整数 n(3≦n≦100)&#xff0c;代表需要构造的变量长度。 输出描述: 输出一个长度为 n 的字符串&#x…...

React 18 的新功能:构建高性能应用的革新之道

React 18 的发布标志着前端开发进入了一个全新的并发时代。作为 React 历史上最重要的版本之一&#xff0c;它不仅带来了底层架构的深度重构&#xff0c;更通过一系列创新功能重新定义了现代 Web 应用的开发范式。这些特性在保持向后兼容的同时&#xff0c;为开发者提供了前所未…...

Python-Flask-Dive

Python-Flask-Dive 适用Python编写一个Flask的快速上手模板&#xff0c;后续如果需要使用Python快速进行we端的验证可以直接下载使用 1-项目创建 本项目仓库代码地址&#xff1a;https://gitee.com/enzoism/python_flask_dive 1-Python环境 ## 1-空工程初始化环境 mkdir my_pr…...

热门CPS联盟小程序聚合平台与CPA推广系统开发搭建:助力流量变现与用户增长

一、行业趋势&#xff1a;CPS与CPA模式成流量变现核心 在移动互联网流量红利见顶的背景下&#xff0c;CPS&#xff08;按销售付费&#xff09;和CPA&#xff08;按行为付费&#xff09;模式因其精准的投放效果和可控的成本&#xff0c;成为企业拉新与用户增长的核心工具。 CPS…...

16.three官方示例+编辑器+AI快速学习webgl_buffergeometry_lines_indexed

本实例主要讲解内容 这个Three.js示例展示了如何使用**索引几何体(Indexed Geometry)**创建复杂的分形线条图案。通过递归算法生成科赫雪花(Koch Snowflake)曲线&#xff0c;并利用索引缓冲区优化顶点数据存储&#xff0c;实现高效的线条渲染。 核心技术包括&#xff1a; 索…...

PowerBI基础

一、前言 在当今数据驱动的时代&#xff0c;如何高效地整理、分析并呈现数据&#xff0c;已成为企业和个人提升决策质量的关键能力。Power BI 作为微软推出的强大商业智能工具&#xff0c;正帮助全球用户将海量数据转化为直观、动态的可视化洞察。数据的世界充满可能性&#xf…...

【MCP】魔搭社区MCP服务(高德地图、everything文件搜索)

【MCP】魔搭社区MCP服务&#xff08;高德地图、everything文件搜索&#xff09; 1、上手使用2、环境配置&#xff08;1&#xff09;cherry-studio配置&#xff08;2&#xff09;添加魔搭大模型服务&#xff08;如果已经设置了其他大模型服务&#xff0c;可跳过&#xff09;&…...