|
|
@@ -75,8 +75,11 @@ const inputValue = computed(() => (props.modelValue !== null && props.modelValue
|
|
|
// 解析后缀,识别文件类型
|
|
|
const getTypeByUrl = (url) => {
|
|
|
if (!url) return 'file';
|
|
|
- const u = (url.split('?')[0] || '').toLowerCase();
|
|
|
- const ext = (u.split('.').pop() || '').trim();
|
|
|
+ // 清理可能包裹的引号并取无查询参数的部分
|
|
|
+ const cleaned = String(url).trim().replace(/^['"]+|['"]+$/g, '');
|
|
|
+ const u = (cleaned.split('?')[0] || '').toLowerCase();
|
|
|
+ // 提取扩展名并去除非字母数字的尾随字符(如引号)
|
|
|
+ let ext = (u.split('.').pop() || '').trim().replace(/[^a-z0-9]+$/g, '');
|
|
|
const imgExt = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];
|
|
|
const videoExt = ['mp4', 'mov', 'avi', 'mkv', 'webm', 'm4v'];
|
|
|
if (imgExt.includes(ext)) return 'image';
|
|
|
@@ -96,23 +99,26 @@ const items = computed(() => {
|
|
|
let size = undefined;
|
|
|
let coverUrl = '';
|
|
|
if (typeof raw === 'string') {
|
|
|
- url = raw;
|
|
|
+ url = String(raw).trim().replace(/^['"]+|['"]+$/g, '');
|
|
|
} else if (typeof raw === 'object') {
|
|
|
- url = raw[props.keyName] || raw.url || '';
|
|
|
+ url = String(raw[props.keyName] || raw.url || '').trim().replace(/^['"]+|['"]+$/g, '');
|
|
|
name = raw[props.nameKey] || raw.name || '';
|
|
|
size = raw[props.sizeKey] || raw.size;
|
|
|
- coverUrl = raw[props.coverKey] || raw.coverUrl || '';
|
|
|
+ coverUrl = String(raw[props.coverKey] || raw.coverUrl || '').trim().replace(/^['"]+|['"]+$/g, '');
|
|
|
}
|
|
|
if (!url) return;
|
|
|
const originalUrl = (url.split('?')[0] || url);
|
|
|
const type = getTypeByUrl(originalUrl);
|
|
|
+
|
|
|
out.push({ type, url, originalUrl, name, size, coverUrl });
|
|
|
};
|
|
|
- if (Array.isArray(v)) {
|
|
|
- v.forEach(pushItem);
|
|
|
- } else {
|
|
|
- pushItem(v);
|
|
|
- }
|
|
|
+ if (Array.isArray(v)) {
|
|
|
+ v.forEach(pushItem);
|
|
|
+ } else if (typeof v === 'string') {
|
|
|
+ v.split(',').forEach((s) => pushItem(s));
|
|
|
+ } else {
|
|
|
+ pushItem(v);
|
|
|
+ }
|
|
|
return out;
|
|
|
});
|
|
|
|