Layui上传组件如何实现上传图片时自动添加日期水印

云强吖_9519

云强吖_9519

2026-07-04

989人浏览

原创

水印必须在后端生成,因前端 canvas 受跨域和安全限制无法导出被污染的画布;layui 前端只传原始文件,后端用 imagesharp 或 system.drawing 加时间水印并返回新 url。

水印必须在后端生成,前端 canvas 无法绕过跨域和安全限制

直接在前端用 canvas 给上传前的图片加水印,看似可行,但实际会卡在 failed to execute 'todataurl' on 'htmlcanvaselement': tainted canvases may not be exported 错误上——只要图片来自本地 file 或跨域 url,canvas 就被污染,无法导出 blob 供上传。layui 的 choose 回调里拿到的 file 对象是 blob,不能直接 drawimage;而预览用的 result(base64)又因浏览器策略不支持跨域图片解码为 canvas 图像。所以,水印逻辑必须移交后端。

前端只需传原始文件,不处理水印逻辑

Layui 上传配置保持简洁,避免在 choose 或 before 中尝试 canvas 操作:

  • auto: true 或 auto: false 都可,但不要在 choose 里调用 obj.preview() 后再试图修改 canvas 内容
  • accept: 'images' 限定类型,防止非图文件触发后端异常
  • url 指向真实后端接口(如 /upload/watermark),不要拼接参数干扰 multipart 解析
  • 不需要手动读取 File、转 base64、塞进 canvas —— 这些全是徒劳且易错

.NET MVC 后端接收并添加时间水印的关键点

核心是用 System.Drawing(或更现代的 ImageSharp)在内存中加载图片、绘制文字、保存回流。注意三点:

  • 水印文字建议用拍摄时间(EXIF 中的 DateTimeOriginal)而非服务器当前时间,避免时区/系统时间不准问题;若无 EXIF,则 fallback 到 DateTime.Now
  • 字体必须存在且路径可访问,推荐用绝对路径加载 FontFamily.GenericSansSerif 或嵌入 ttf 字体资源,避免 ArgumentException: FontFamily 异常
  • 输出格式需与原图一致:Jpeg 保持 image/jpeg,Png 保留透明通道,别硬转成 jpg 导致失真

示例关键片段(C#):

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载
var image = Image.FromStream(file.InputStream);
using var g = Graphics.FromImage(image);
g.DrawString(DateTime.Now.ToString("yyyy-MM-dd HH:mm"), 
    new Font("Microsoft Sans Serif", 12), 
    Brushes.White, 
    new PointF(image.Width - 120, image.Height - 20));

上传响应必须返回带水印的新文件 URL,而非原图路径

后端处理完水印后,不能直接返回原始文件名或未处理路径。Layui 的 done 回调里拿到的 res 应包含:

  • url:指向已加水印的图片地址(如 /uploads/202607011806_wm.jpg)
  • originalName:原始文件名,用于界面展示
  • 不要返回 success: true 这类冗余字段,Layui 不依赖它判断成功

前端 done 中直接用 res.url 更新 img 标签或列表项即可。如果发现页面显示的还是原图,大概率是后端返回了旧路径,或 CDN 缓存了未加水印版本 —— 此时要检查响应头是否含 Cache-Control: no-cache。

水印位置、字体大小、描边颜色这些细节,都在后端绘制阶段决定,前端只管传、收、显。最容易被忽略的是:EXIF 时间提取需要额外 nuget 包(如 MetadataExtractor),且 JPEG 文件头部结构复杂,简单读取 file.InputStream 可能导致流位置偏移,引发图像解析失败。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

layui

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

3891

6

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

244

21

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

40

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

140

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

140

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

100

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

100

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

120

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

320

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 12.8万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 11万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习