From d1300b87965bda721d397c5861d86f9144d726b9 Mon Sep 17 00:00:00 2001 From: augushong Date: Fri, 1 May 2026 09:11:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=84=E7=90=86=E5=92=8C=E7=B2=98=E8=B4=B4?= =?UTF-8?q?=E5=9B=BE=E7=89=87URL=E6=9B=BF=E6=8D=A2=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 UploadFiles 中 $request->file() 可能返回 null 导致类型错误的问题,确保 $files 始终为数组 - 优化粘贴外部图片 URL 处理逻辑,使用正则匹配提取所有外部 URL 后统一延迟处理,避免替换错误 - 增加 URL 转义处理,防止特殊字符在正则替换时出错 --- app/UploadFiles.php | 5 +- view/admin/post/edit_content_markdown.html | 74 ++++++++++------------ 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/app/UploadFiles.php b/app/UploadFiles.php index 8c380a4..234dbc5 100644 --- a/app/UploadFiles.php +++ b/app/UploadFiles.php @@ -156,7 +156,10 @@ class UploadFiles } $dir_name = $request->param('dir', $type); - $files = $request->file(); + $files = $request->file('file') ?? []; + if (!is_array($files)) { + $files = [$files]; + } $succMap = []; $errFiles = []; diff --git a/view/admin/post/edit_content_markdown.html b/view/admin/post/edit_content_markdown.html index 01b298e..7b1b1b4 100644 --- a/view/admin/post/edit_content_markdown.html +++ b/view/admin/post/edit_content_markdown.html @@ -156,55 +156,49 @@ }); // 外部 URL 图片粘贴处理 + // Vditor 粘贴 HTML 时会将 转为 Markdown 图片语法 + // 需要延迟等待 Vditor 完成粘贴解析后,再替换外部 URL 为本地 URL document.addEventListener('paste', function (e) { var pasteStr = e.clipboardData.getData('text/html'); if (!pasteStr) return; - var imgReg = /|\/>)/gi; - var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; - var arr = pasteStr.match(imgReg); + var imgReg = /]*src=[\'\"]?([^\'\"]*)[\'\"]?/gi; + var externalUrls = []; + var match; + while ((match = imgReg.exec(pasteStr)) !== null) { + if (match[1] && match[1].substr(0, 4) === 'http') { + externalUrls.push(match[1]); + } + } + if (externalUrls.length === 0) return; - if (!arr || arr.length === 0) return; + setTimeout(function () { + var pending = externalUrls.length; + layer.load(); - layer.load(); - var pending = arr.length; - - for (var i = 0; i < arr.length; i++) { - (function (imgTag) { - var src = imgTag.match(srcReg); - if (src && src[1]) { - var imgSrc = src[1]; - if (imgSrc.substr(0, 4) === 'http') { - $.ajax({ - type: 'POST', - url: "{:url('File/urlSave')}", - data: { url: imgSrc, type: 'editor' }, - success: function (result) { - if (result.code === 0) { - var mdImg = '![](' + result.data.src + ')'; - var oldMdImg = '![](' + imgSrc + ')'; - var current = vditor.getValue(); - vditor.setValue(current.replace(oldMdImg, mdImg)); - } - pending--; - if (pending === 0) layer.closeAll('loading'); - }, - error: function () { - pending--; - if (pending === 0) layer.closeAll('loading'); - } - }); - } else { + externalUrls.forEach(function (url) { + $.ajax({ + type: 'POST', + url: "{:url('File/urlSave')}", + data: { url: url, type: 'editor' }, + success: function (result) { + if (result.code === 0) { + var escapedUrl = url.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + var regex = new RegExp('!\\[[^\\]]*\\]\\(' + escapedUrl + '\\)', 'g'); + var current = vditor.getValue(); + vditor.setValue(current.replace(regex, '![](' + result.data.src + ')')); + } + pending--; + if (pending === 0) layer.closeAll('loading'); + }, + error: function () { pending--; if (pending === 0) layer.closeAll('loading'); } - } else { - pending--; - if (pending === 0) layer.closeAll('loading'); - } - })(arr[i]); - } - }); + }); + }); + }, 800); + }, true); // 标题变更保存 $('#title-input').change(function () {