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

原生 JS 实现图片预览上传组件:多图上传 + 拖拽上传 + 裁剪预览 + 进度显示(附完整源码)

前言图片上传是前端开发中高频且核心的功能场景如头像上传、素材管理、表单提交等。本文基于原生 HTMLCSSJavaScript 实现一套企业级图片预览上传组件包含多图选择、拖拽上传、实时预览、图片裁剪、上传进度显示、文件大小 / 格式校验等功能无任何第三方框架依赖代码模块化封装可直接集成到各类项目中。实现效果支持单图 / 多图选择上传兼容主流浏览器拖拽上传可直接将图片拖入上传区域完成选择实时预览选中图片后立即展示缩略图支持删除单张图片图片裁剪内置简易裁剪功能支持固定比例裁剪格式 / 大小校验限制仅允许 jpg/png/webp 格式可自定义文件大小上限上传进度模拟 AJAX 上传实时显示上传进度条响应式布局适配 PC 端、平板、手机等多端设备友好提示操作反馈清晰错误提示直观技术栈HTML5FileReader API、拖放 API、Canvas图片裁剪CSS3Flex 布局、Grid 布局、过渡动画、响应式适配原生 JavaScript文件处理、Blob/FormData、异步编程、DOM 操作性能优化图片压缩、懒加载思想、事件委托完整代码html预览!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title图片预览上传组件 | 原生JS实现/title meta namekeywords content图片上传,原生JS,拖拽上传,图片预览,图片裁剪,FileReader meta namedescription content原生JavaScript实现图片预览上传组件支持多图上传、拖拽上传、裁剪预览、进度显示、格式校验 link relstylesheet hrefhttps://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css style * { margin: 0; padding: 0; box-sizing: border-box; font-family: Microsoft YaHei, sans-serif; } body { background-color: #f8f9fa; color: #333; line-height: 1.6; padding: 50px 20px; } .upload-container { max-width: 1000px; margin: 0 auto; background-color: #fff; border-radius: 10px; box-shadow: 0 2px 20px rgba(0,0,0,0.08); padding: 30px; } .upload-header { margin-bottom: 25px; padding-bottom: 15px; border-bottom: 1px solid #eee; } .upload-header h2 { color: #2c3e50; font-size: 24px; margin-bottom: 8px; } .upload-header .tips { color: #666; font-size: 14px; } /* 上传区域样式 */ .upload-area { border: 2px dashed #ddd; border-radius: 8px; padding: 40px 20px; text-align: center; cursor: pointer; transition: all 0.3s ease; margin-bottom: 30px; } .upload-area:hover { border-color: #3498db; background-color: #f0f8ff; } .upload-area.active { border-color: #2ecc71; background-color: #f8fff8; } .upload-icon { font-size: 48px; color: #999; margin-bottom: 15px; transition: color 0.3s; } .upload-area:hover .upload-icon { color: #3498db; } .upload-text { font-size: 16px; color: #666; margin-bottom: 10px; } .upload-hint { font-size: 12px; color: #999; } #fileInput { display: none; } /* 预览区域样式 */ .preview-container { margin-bottom: 30px; } .preview-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .preview-title { font-size: 18px; color: #333; } .preview-actions { display: flex; gap: 10px; } .action-btn { padding: 6px 12px; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; transition: all 0.3s; } .crop-btn { background-color: #3498db; color: #fff; } .clear-btn { background-color: #e74c3c; color: #fff; } .action-btn:hover { opacity: 0.9; transform: translateY(-2px); } .preview-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 15px; } .preview-item { position: relative; border-radius: 6px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1); aspect-ratio: 1/1; } .preview-img { width: 100%; height: 100%; object-fit: cover; display: block; } .preview-close { position: absolute; top: 5px; right: 5px; width: 24px; height: 24px; background-color: rgba(0,0,0,0.6); color: #fff; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; font-size: 12px; transition: all 0.2s; } .preview-close:hover { background-color: #e74c3c; } /* 进度条样式 */ .upload-progress { margin-bottom: 25px; display: none; } .progress-bar { width: 100%; height: 8px; background-color: #eee; border-radius: 4px; overflow: hidden; margin-top: 8px; } .progress-fill { height: 100%; background-color: #2ecc71; width: 0%; transition: width 0.3s ease; border-radius: 4px; } /* 上传按钮 */ .submit-btn { width: 100%; padding: 12px; background-color: #2ecc71; color: #fff; border: none; border-radius: 6px; font-size: 16px; cursor: pointer; transition: all 0.3s; } .submit-btn:disabled { background-color: #bdc3c7; cursor: not-allowed; transform: none; } .submit-btn:hover:not(:disabled) { background-color: #27ae60; transform: translateY(-2px); } /* 裁剪弹窗 */ .crop-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.7); display: none; align-items: center; justify-content: center; z-index: 999; padding: 20px; } .crop-content { background-color: #fff; border-radius: 8px; width: 100%; max-width: 800px; padding: 20px; } .crop-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .crop-title { font-size: 18px; color: #333; } .crop-close { font-size: 20px; cursor: pointer; color: #666; } .crop-close:hover { color: #e74c3c; } .crop-body { display: flex; flex-direction: column; gap: 20px; } .crop-preview { width: 100%; height: 300px; border: 1px solid #eee; display: flex; align-items: center; justify-content: center; overflow: hidden; } .crop-img { max-width: 100%; max-height: 100%; } .crop-actions { display: flex; justify-content: flex-end; gap: 10px; } .confirm-crop { background-color: #3498db; color: #fff; } /* 响应式适配 */ media (max-width: 768px) { .upload-container { padding: 20px; } .upload-area { padding: 30px 15px; } .crop-preview { height: 200px; } } media (max-width: 480px) { .preview-list { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); } .upload-header h2 { font-size: 20px; } } /style /head body div classupload-container !-- 头部说明 -- div classupload-header h2图片上传组件/h2 p classtips支持多图上传、拖拽上传、图片裁剪仅允许上传jpg/png/webp格式单张图片不超过5MB/p /div !-- 上传区域 -- div classupload-area iduploadArea input typefile idfileInput acceptimage/jpeg,image/png,image/webp multiple div classupload-icon i classfas fa-cloud-upload-alt/i /div div classupload-text点击或拖拽图片到此处上传/div div classupload-hint支持jpg、png、webp格式单张不超过5MB/div /div !-- 预览区域 -- div classpreview-container idpreviewContainer styledisplay: none; div classpreview-header h3 classpreview-title图片预览/h3 div classpreview-actions button classaction-btn crop-btn idcropBtn disabled裁剪选中图片/button button classaction-btn clear-btn idclearBtn清空所有/button /div /div div classpreview-list idpreviewList/div /div !-- 上传进度 -- div classupload-progress iduploadProgress div classprogress-text上传进度span idprogressPercent0/span%/div div classprogress-bar div classprogress-fill idprogressFill/div /div /div !-- 上传按钮 -- button classsubmit-btn idsubmitBtn disabled开始上传/button /div !-- 裁剪弹窗 -- div classcrop-modal idcropModal div classcrop-content div classcrop-header h3 classcrop-title图片裁剪/h3 span classcrop-close idcropClosei classfas fa-times/i/span /div div classcrop-body div classcrop-preview idcropPreview img src alt裁剪预览 classcrop-img idcropImg /div div classcrop-actions button classaction-btn idcancelCrop取消/button button classaction-btn confirm-crop idconfirmCrop确认裁剪/button /div /div /div /div script // 全局变量 let fileList []; // 存储选中的文件 let selectedImageIndex -1; // 当前选中的图片索引 let cropFile null; // 待裁剪的文件 // DOM元素缓存 const uploadArea document.getElementById(uploadArea); const fileInput document.getElementById(fileInput); const previewContainer document.getElementById(previewContainer); const previewList document.getElementById(previewList); const cropBtn document.getElementById(cropBtn); const clearBtn document.getElementById(clearBtn); const submitBtn document.getElementById(submitBtn); const uploadProgress document.getElementById(uploadProgress); const progressPercent document.getElementById(progressPercent); const progressFill document.getElementById(progressFill); const cropModal document.getElementById(cropModal); const cropImg document.getElementById(cropImg); const cropClose document.getElementById(cropClose); const cancelCrop document.getElementById(cancelCrop); const confirmCrop document.getElementById(confirmCrop); // 初始化 function init() { bindEvents(); } // 绑定所有事件 function bindEvents() { // 点击上传区域触发文件选择 uploadArea.addEventListener(click, () { fileInput.click(); }); // 拖放相关事件 uploadArea.addEventListener(dragover, (e) { e.preventDefault(); uploadArea.classList.add(active); }); uploadArea.addEventListener(dragleave, () { uploadArea.classList.remove(active); }); uploadArea.addEventListener(drop, (e) { e.preventDefault(); uploadArea.classList.remove(active); const files e.dataTransfer.files; handleFiles(files); }); // 文件选择事件 fileInput.addEventListener(change, (e) { const files e.target.files; handleFiles(files); }); // 清空所有图片 clearBtn.addEventListener(click, () { if (confirm(确定要清空所有图片吗)) { fileList []; selectedImageIndex -1; updatePreview(); updateButtonStatus(); } }); // 裁剪按钮事件 cropBtn.addEventListener(click, () { if (selectedImageIndex 0 selectedImageIndex fileList.length) { cropFile fileList[selectedImageIndex]; const reader new FileReader(); reader.onload (e) { cropImg.src e.target.result; cropModal.style.display flex; }; reader.readAsDataURL(cropFile); } }); // 关闭裁剪弹窗 cropClose.addEventListener(click, () { cropModal.style.display none; cropFile null; }); cancelCrop.addEventListener(click, () { cropModal.style.display none; cropFile null; }); // 确认裁剪简易裁剪实际项目可集成cropper.js confirmCrop.addEventListener(click, () { // 创建Canvas进行裁剪此处模拟1:1裁剪 const canvas document.createElement(canvas); const ctx canvas.getContext(2d); const img new Image(); img.onload () { // 取图片最小边作为裁剪尺寸实现1:1裁剪 const size Math.min(img.width, img.height); canvas.width size; canvas.height size; // 居中裁剪 const x (img.width - size) / 2; const y (img.height - size) / 2; ctx.drawImage(img, x, y, size, size, 0, 0, size, size); // 将Canvas转为Blob canvas.toBlob((blob) { // 替换原文件 const newFile new File([blob], cropFile.name, { type: cropFile.type, lastModified: Date.now() }); fileList[selectedImageIndex] newFile; updatePreview(); cropModal.style.display none; cropFile null; }, cropFile.type); }; img.src cropImg.src; }); // 提交上传 submitBtn.addEventListener(click, () { if (fileList.length 0) { alert(请先选择要上传的图片); return; } simulateUpload(); }); // 预览项点击/删除事件事件委托 previewList.addEventListener(click, (e) { const previewItem e.target.closest(.preview-item); if (!previewItem) return; const index parseInt(previewItem.dataset.index); // 删除图片 if (e.target.classList.contains(preview-close)) { fileList.splice(index, 1); // 重置选中索引 if (selectedImageIndex index) { selectedImageIndex -1; } else if (selectedImageIndex index) { selectedImageIndex--; } updatePreview(); updateButtonStatus(); return; } // 选中图片用于裁剪 selectedImageIndex index; // 移除所有选中样式 document.querySelectorAll(.preview-item).forEach(item { item.style.border none; }); // 添加选中样式 previewItem.style.border 2px solid #3498db; cropBtn.disabled false; }); } // 处理选中的文件 function handleFiles(files) { if (!files || files.length 0) return; // 遍历文件 for (let i 0; i files.length; i) { const file files[i]; // 校验文件类型 if (![image/jpeg, image/png, image/webp].includes(file.type)) { alert(文件${file.name}格式不支持仅允许jpg/png/webp格式); continue; } // 校验文件大小5MB const maxSize 5 * 1024 * 1024; if (file.size maxSize) { alert(文件${file.name}大小超过5MB限制); continue; } // 添加到文件列表 fileList.push(file); } // 更新预览和按钮状态 updatePreview(); updateButtonStatus(); } // 更新预览列表 function updatePreview() { if (fileList.length 0) { previewContainer.style.display none; return; } previewContainer.style.display block; previewList.innerHTML ; // 渲染预览项 fileList.forEach((file, index) { const reader new FileReader(); reader.onload (e) { const previewItem document.createElement(div); previewItem.className preview-item; previewItem.dataset.index index; // 选中状态样式 if (index selectedImageIndex) { previewItem.style.border 2px solid #3498db; } previewItem.innerHTML img src${e.target.result} alt预览图 classpreview-img span classpreview-closei classfas fa-times/i/span ; previewList.appendChild(previewItem); }; reader.readAsDataURL(file); }); } // 更新按钮状态 function updateButtonStatus() { // 上传按钮状态 submitBtn.disabled fileList.length 0; // 裁剪按钮状态 cropBtn.disabled selectedImageIndex 0 || fileList.length 0; } // 模拟上传实际项目替换为真实AJAX请求 function simulateUpload() { uploadProgress.style.display block; submitBtn.disabled true; clearBtn.disabled true; cropBtn.disabled true; let progress 0; const totalFiles fileList.length; let uploadedFiles 0; // 模拟进度更新 const progressInterval setInterval(() { uploadedFiles; progress Math.floor((uploadedFiles / totalFiles) * 100); progressPercent.textContent progress; progressFill.style.width ${progress}%; // 上传完成 if (progress 100) { clearInterval(progressInterval); // 延迟提示模拟真实上传耗时 setTimeout(() { alert(成功上传${totalFiles}张图片); // 重置状态 fileList []; selectedImageIndex -1; uploadProgress.style.display none; progressFill.style.width 0%; progressPercent.textContent 0; updatePreview(); updateButtonStatus(); clearBtn.disabled false; }, 500); } }, 500); // 实际项目中使用FormData上传示例 /* const formData new FormData(); fileList.forEach(file { formData.append(files, file); }); fetch(/api/upload, { method: POST, body: formData, onUploadProgress: (e) { const progress Math.floor((e.loaded / e.total) * 100); progressPercent.textContent progress; progressFill.style.width ${progress}%; } }).then(response response.json()) .then(data { alert(上传成功); // 后续处理 }).catch(error { alert(上传失败 error.message); }); */ } // 启动应用 init(); /script /body /html功能说明基础上传点击上传区域可打开文件选择器支持多选图片自动过滤非图片文件限制单张图片大小不超过 5MB。拖拽上传直接将本地图片拖入上传区域自动完成文件选择和校验操作更便捷。图片预览选中图片后实时生成缩略图预览预览项支持点击选中、删除单张图片、清空所有图片。图片裁剪选中单张图片后点击 “裁剪选中图片”可打开裁剪弹窗进行 1:1 比例裁剪裁剪后替换原图片。上传进度点击 “开始上传” 后模拟上传进度实时显示上传百分比和进度条上传完成后给出成功提示。格式校验仅允许上传 jpg/png/webp 格式图片非支持格式会给出明确的错误提示。响应式适配预览列表采用网格布局自动适配不同屏幕宽度移动端优化显示效果。总结本图片上传组件基于原生 JS 实现无任何第三方依赖涵盖了企业级图片上传场景的核心功能代码结构清晰、模块化程度高易于扩展和二次开发。开发者可在此基础上进一步扩展集成专业裁剪库如 cropper.js实现更灵活的裁剪功能增加图片压缩功能降低上传带宽消耗对接真实后端接口实现图片上传到服务器增加上传失败重试、断点续传等高级功能支持图片旋转、缩放、水印添加等编辑功能。该组件可直接应用于表单提交、头像上传、素材管理等业务场景是前端开发中极具实用价值的实战项目。

相关文章:

原生 JS 实现图片预览上传组件:多图上传 + 拖拽上传 + 裁剪预览 + 进度显示(附完整源码)

前言图片上传是前端开发中高频且核心的功能场景,如头像上传、素材管理、表单提交等。本文基于原生 HTMLCSSJavaScript 实现一套企业级图片预览上传组件,包含多图选择、拖拽上传、实时预览、图片裁剪、上传进度显示、文件大小 / 格式校验等功能&#xff0…...

反向海淘商家必看!精细拍照服务,帮你降本留客不踩坑

做反向海淘生意的商家都懂,最头疼的莫过于用户投诉与跨境退货——海外用户担心货不对版不敢下单,下单后因实物与图片不符发起退货,高额跨境运费、人力成本,不仅压缩利润,还会拉低店铺口碑,甚至流失核心客群…...

GLM-4V-9B惊艳效果展示:电路板图元器件识别+故障点定位+维修指引生成

GLM-4V-9B惊艳效果展示:电路板图元器件识别故障点定位维修指引生成 安全声明:本文仅展示AI技术能力,所有电路板图像均为演示用途,不涉及任何实际设备或敏感信息 1. 项目概述与核心能力 GLM-4V-9B多模态大模型在工业视觉检测领域展…...

12款免费网页数据采集神器,零基础也能轻松爬取全网信息!

一、零基础入门级工具1. 火车采集器 - 国产老牌采集神器火车采集器是国内资历深厚的采集工具,操作门槛极低,无需任何编程基础,新手也能快速上手,堪称零基础用户的“入门首选”。使用步骤:下载并安装火车采集器客户端&a…...

OpenClaw备份策略:千问3.5-27B智能压缩历史聊天记录

OpenClaw备份策略:千问3.5-27B智能压缩历史聊天记录 1. 为什么需要智能备份策略 作为一个长期使用OpenClaw进行日常工作的开发者,我发现随着使用时间的增长,聊天记录文件开始占据大量存储空间。最初我的解决方案是简单粗暴的定期删除&#…...

A20B-8200-0927控制器模块

A20B-8200-0927控制器模块是一款面向工业自动化与数控系统应用的关键控制单元,具备良好的数据处理能力与系统协调性能,能够在复杂工况下实现稳定可靠的设备控制,广泛应用于自动化产线及数控设备中。采用高性能处理架构,提升整体运…...

STM32F103C8T6 + MPU6050 + TB6612:手把手教你从零搭建两轮平衡小车(附完整源码与PCB)

STM32F103C8T6 MPU6050 TB6612:从零构建两轮平衡小车的工程实践 平衡小车一直是嵌入式开发者入门的经典项目,它不仅融合了传感器技术、控制算法和机电一体化设计,还能让你在实践中深入理解PID控制等核心概念。今天我们就来拆解一个基于STM3…...

Vitis新建工程下载程序出现错误

...

STM32最小系统PCB布线实战:从元器件布局到GND敷铜

1. STM32最小系统PCB设计入门指南 第一次接触STM32最小系统板设计时,我被密密麻麻的元器件和错综复杂的走线搞得头晕眼花。后来才发现,只要掌握几个关键原则,PCB布线并没有想象中那么难。STM32最小系统板通常包含主控芯片、电源模块、时钟电路…...

[AI应用框架/Java] Spring AI 应用开发指南<>概述、快速入门鼻

本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)。 …...

OpenClaw 不会安装的,一键安装包来了,代码开源!有

一、核心问题及解决方案(按踩坑频率排序) 问题 1:误删他人持有锁——最基础也最易犯的漏洞 成因:释放锁时未做身份校验,直接执行 DEL 命令删除键。典型场景:服务 A 持有锁后,业务逻辑耗时超过锁…...

二极管工作原理与应用全解析

1. 二极管基础认知:电子世界的单向阀门我第一次接触二极管是在大学电子实验课上,当时看着这个小小的玻璃管状元件,很难想象它能在电路中起到如此关键的作用。直到亲眼目睹它只允许电流单向通过的特性,才真正理解为什么工程师们称它…...

用普中开发板A234和Proteus 8.16,手把手复刻一个课堂/竞赛用的八路抢答器(附完整代码和避坑点)

用普中开发板A234和Proteus 8.16打造竞赛级八路抢答器实战指南 在电子设计竞赛、课堂互动或社团活动中,一个稳定可靠的抢答器往往是点燃现场气氛的关键设备。市面上虽然有不少成品抢答器,但价格昂贵且功能固定,难以满足个性化需求。而基于51单…...

Windows下OpenClaw安装详解:Qwen3.5-9B接口对接避坑指南

Windows下OpenClaw安装详解:Qwen3.5-9B接口对接避坑指南 1. 为什么选择WindowsOpenClaw组合 去年开始接触AI自动化工具时,我尝试过不少方案,但要么需要复杂的Linux环境配置,要么对个人开发者不够友好。直到发现OpenClaw这个能在…...

turbo迁移vite-plus实践逞

认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...

STM32单片机低功耗模式与应用实践

1. STM32单片机低功耗模式深度解析作为一名嵌入式开发者,我经常遇到需要优化功耗的场景。STM32系列单片机提供了多种低功耗模式,合理使用这些模式可以显著延长电池供电设备的续航时间。本文将结合我多年的实战经验,详细剖析STM32F10xx系列的低…...

从UWB定位到分布式控制:一个智能跟随行李箱的完整系统架构解析

1. 智能跟随行李箱的技术演进与市场需求 记得我第一次在机场看到智能跟随行李箱时,那种科技感十足的自动跟随场景让我印象深刻。这种能够解放双手的旅行伴侣,正在悄然改变着人们的出行方式。从技术角度看,现代智能行李箱已经实现了从简单的机…...

百度百舸 x 昆仑芯,加速 GLM-5.1 从开源发布到规模化应用

今日,智谱正式开源新一代大模型 GLM 5.1。作为智谱 GLM 系列的最新力作,GLM-5.1 的整体能力得到了全面提升。尤其在代码能力上:在最接近真实软件开发的 SWE-bench Pro 基准测试中,GLM-5.1 超过 GPT-5.4、Claude Opus 4.6&#xff…...

OpenClaw技能扩展指南:为Qwen3-4B-Thinking添加公众号发布模块

OpenClaw技能扩展指南:为Qwen3-4B-Thinking添加公众号发布模块 1. 为什么需要公众号发布技能 上周我尝试用OpenClaw自动整理技术文档时,突然想到个痛点:每次写完文章都要手动复制到公众号后台,调整格式、上传封面、设置摘要&…...

分享我用稳卖AI浏览器实操出来的:AI选品降低试错成本思路

很多跨境卖家都有类似经历:一个产品在决定要不要做的时候,表面上看信息不少,但真正落到“为什么选它”这个问题上,判断依据往往并不够扎实。有时候是看到某个平台趋势不错,有时候是看到竞品最近销量有变化,…...

OpenClaw多模态开发:千问3.5-27B视觉API调用与结果解析

OpenClaw多模态开发:千问3.5-27B视觉API调用与结果解析 1. 为什么选择OpenClaw对接多模态模型 去年我在整理个人照片库时,发现手动标注几千张旅行照片几乎是不可能完成的任务。直到偶然接触到OpenClaw和千问3.5-27B的组合,才找到自动化解决…...

氧化镓高体积热容的特性,集成高介电常数界面的结侧冷却架构

速览:技术背景与挑战背景: 虽然宽禁带(WBG)半导体(如SiC、GaN)已取得进展,但超宽禁带(UWBG)材料如氧化镓(Ga₂O₃)具有更高的理论极限。痛点&…...

OpenClaw+Qwen3-14b_int4_awq低成本方案:自建模型接口替代OpenAI API

OpenClawQwen3-14b_int4_awq低成本方案:自建模型接口替代OpenAI API 1. 为什么需要本地模型替代OpenAI API 去年我在开发一个自动化内容处理系统时,遇到了一个棘手的问题:OpenAI API的Token消耗速度远超预期。当时系统需要处理大量长文本&a…...

韩国GaN外延片技术专家 IVWorks 宣布完成 450万美元的新一轮融资

核心技术:reGaN 与外延专长IVWorks 依托其在磊晶(Epiwafer)领域的深厚积累,正在向多个高端领域扩张:核心技术:基于选择性区域再生长(Selective Area Regrowth)技术的 reGaN。技术价值…...

OpenClaw+百川2-13B-4bits:智能客服模拟器搭建教程

OpenClaw百川2-13B-4bits:智能客服模拟器搭建教程 1. 为什么需要本地化客服模拟器 去年参与一个电商项目时,我遇到了一个典型痛点:每次修改客服话术都需要重新训练线上模型,既消耗API费用又影响真实客户体验。当时就萌生了搭建本…...

、SEATA分布式事务——XA模式奖

MySQL 中的 count 三兄弟:效率大比拼! 一、快速结论(先看结论再看分析) 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的!我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄弟…...

OpenClaw模型配置详解:Kimi-VL-A3B-Thinking多模态接口接入

OpenClaw模型配置详解:Kimi-VL-A3B-Thinking多模态接口接入 1. 为什么选择Kimi-VL-A3B-Thinking 去年我在尝试构建一个自动化内容处理工作流时,发现市面上大多数模型对图文混合内容的理解能力有限。直到偶然在开发者社区看到Kimi-VL-A3B-Thining的评测…...

OpenClaw跨平台配置指南:千问3.5-35B-A3B-FP8在mac与Win下的对接

OpenClaw跨平台配置指南:千问3.5-35B-A3B-FP8在mac与Win下的对接 1. 为什么需要跨平台配置指南 上周我在团队内部推广OpenClaw时遇到一个典型问题:同事A用macOS,同事B用Windows,两人都需要对接同一个千问3.5-35B-A3B-FP8模型。本…...

CodeMagicianT奈

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知,本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台,有非常多的配置参数。详细的参数列表可以…...

从 Apache SeaTunnel 走向 ASF Member:一位开发者的长期主义样本悔

一、中间件是啥?咱用“餐厅”打个比方 想象一下,你的FastAPI应用是个高级餐厅。 ?? 顾客(客户端请求)来到门口。- 迎宾(CORS中间件):先看你是不是从允许的街区(域名)来…...