mirror of
https://gitee.com/ulthon/ulthon_information.git
synced 2026-07-10 03:32:49 +08:00
fix: 修复上传文件处理和粘贴图片URL替换的问题
- 修复 UploadFiles 中 $request->file() 可能返回 null 导致类型错误的问题,确保 $files 始终为数组 - 优化粘贴外部图片 URL 处理逻辑,使用正则匹配提取所有外部 URL 后统一延迟处理,避免替换错误 - 增加 URL 转义处理,防止特殊字符在正则替换时出错
This commit is contained in:
@@ -156,7 +156,10 @@ class UploadFiles
|
|||||||
}
|
}
|
||||||
$dir_name = $request->param('dir', $type);
|
$dir_name = $request->param('dir', $type);
|
||||||
|
|
||||||
$files = $request->file();
|
$files = $request->file('file') ?? [];
|
||||||
|
if (!is_array($files)) {
|
||||||
|
$files = [$files];
|
||||||
|
}
|
||||||
$succMap = [];
|
$succMap = [];
|
||||||
$errFiles = [];
|
$errFiles = [];
|
||||||
|
|
||||||
|
|||||||
@@ -156,35 +156,37 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 外部 URL 图片粘贴处理
|
// 外部 URL 图片粘贴处理
|
||||||
|
// Vditor 粘贴 HTML 时会将 <img> 转为 Markdown 图片语法
|
||||||
|
// 需要延迟等待 Vditor 完成粘贴解析后,再替换外部 URL 为本地 URL
|
||||||
document.addEventListener('paste', function (e) {
|
document.addEventListener('paste', function (e) {
|
||||||
var pasteStr = e.clipboardData.getData('text/html');
|
var pasteStr = e.clipboardData.getData('text/html');
|
||||||
if (!pasteStr) return;
|
if (!pasteStr) return;
|
||||||
|
|
||||||
var imgReg = /<img.*?(?:>|\/>)/gi;
|
var imgReg = /<img[^>]*src=[\'\"]?([^\'\"]*)[\'\"]?/gi;
|
||||||
var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i;
|
var externalUrls = [];
|
||||||
var arr = pasteStr.match(imgReg);
|
var match;
|
||||||
|
while ((match = imgReg.exec(pasteStr)) !== null) {
|
||||||
if (!arr || arr.length === 0) return;
|
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();
|
layer.load();
|
||||||
var pending = arr.length;
|
|
||||||
|
|
||||||
for (var i = 0; i < arr.length; i++) {
|
externalUrls.forEach(function (url) {
|
||||||
(function (imgTag) {
|
|
||||||
var src = imgTag.match(srcReg);
|
|
||||||
if (src && src[1]) {
|
|
||||||
var imgSrc = src[1];
|
|
||||||
if (imgSrc.substr(0, 4) === 'http') {
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
url: "{:url('File/urlSave')}",
|
url: "{:url('File/urlSave')}",
|
||||||
data: { url: imgSrc, type: 'editor' },
|
data: { url: url, type: 'editor' },
|
||||||
success: function (result) {
|
success: function (result) {
|
||||||
if (result.code === 0) {
|
if (result.code === 0) {
|
||||||
var mdImg = '';
|
var escapedUrl = url.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||||
var oldMdImg = '';
|
var regex = new RegExp('!\\[[^\\]]*\\]\\(' + escapedUrl + '\\)', 'g');
|
||||||
var current = vditor.getValue();
|
var current = vditor.getValue();
|
||||||
vditor.setValue(current.replace(oldMdImg, mdImg));
|
vditor.setValue(current.replace(regex, ''));
|
||||||
}
|
}
|
||||||
pending--;
|
pending--;
|
||||||
if (pending === 0) layer.closeAll('loading');
|
if (pending === 0) layer.closeAll('loading');
|
||||||
@@ -194,17 +196,9 @@
|
|||||||
if (pending === 0) layer.closeAll('loading');
|
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 () {
|
$('#title-input').change(function () {
|
||||||
|
|||||||
Reference in New Issue
Block a user