fix: 修复上传文件处理和粘贴图片URL替换的问题

- 修复 UploadFiles 中 $request->file() 可能返回 null 导致类型错误的问题,确保 $files 始终为数组
- 优化粘贴外部图片 URL 处理逻辑,使用正则匹配提取所有外部 URL 后统一延迟处理,避免替换错误
- 增加 URL 转义处理,防止特殊字符在正则替换时出错
This commit is contained in:
augushong
2026-05-01 09:11:43 +08:00
parent aed4b285d8
commit d1300b8796
2 changed files with 38 additions and 41 deletions

View File

@@ -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 = [];

View File

@@ -156,35 +156,37 @@
});
// 外部 URL 图片粘贴处理
// Vditor 粘贴 HTML 时会将 <img> 转为 Markdown 图片语法
// 需要延迟等待 Vditor 完成粘贴解析后,再替换外部 URL 为本地 URL
document.addEventListener('paste', function (e) {
var pasteStr = e.clipboardData.getData('text/html');
if (!pasteStr) return;
var imgReg = /<img.*?(?:>|\/>)/gi;
var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i;
var arr = pasteStr.match(imgReg);
if (!arr || arr.length === 0) return;
var imgReg = /<img[^>]*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;
setTimeout(function () {
var pending = externalUrls.length;
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') {
externalUrls.forEach(function (url) {
$.ajax({
type: 'POST',
url: "{:url('File/urlSave')}",
data: { url: imgSrc, type: 'editor' },
data: { url: url, type: 'editor' },
success: function (result) {
if (result.code === 0) {
var mdImg = '![](' + result.data.src + ')';
var oldMdImg = '![](' + imgSrc + ')';
var escapedUrl = url.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
var regex = new RegExp('!\\[[^\\]]*\\]\\(' + escapedUrl + '\\)', 'g');
var current = vditor.getValue();
vditor.setValue(current.replace(oldMdImg, mdImg));
vditor.setValue(current.replace(regex, '![](' + result.data.src + ')'));
}
pending--;
if (pending === 0) layer.closeAll('loading');
@@ -194,17 +196,9 @@
if (pending === 0) layer.closeAll('loading');
}
});
} else {
pending--;
if (pending === 0) layer.closeAll('loading');
}
} else {
pending--;
if (pending === 0) layer.closeAll('loading');
}
})(arr[i]);
}
});
}, 800);
}, true);
// 标题变更保存
$('#title-input').change(function () {