diff --git a/apps/web/vue3/index.html b/apps/web/vue3/index.html
index 209f8a75b..8711554d2 100644
--- a/apps/web/vue3/index.html
+++ b/apps/web/vue3/index.html
@@ -20869,18 +20869,25 @@ compare: [[flesh, peel]]`;
if (!response.ok) throw new Error(await extensionApiError(response, '文件上传失败'));
const data = await response.json();
const uploaded = (data.files || []).map(name => `input/${jobId}/${name}`);
- const targetInput = lightweightNlRun.inputs.find(item => !String(item.value || '').trim()) || lightweightNlRun.inputs[0];
- if (targetInput) {
- targetInput.value = uploaded.shift() || '';
- const rest = uploaded.filter(Boolean);
- if (rest.length) {
- const emptyInputs = lightweightNlRun.inputs.filter(item => !String(item.value || '').trim());
- for (let i = 0; i < rest.length && i < emptyInputs.length; i++) {
- emptyInputs[i].value = rest[i];
- }
+ // 优先按文件名与输入槽名精确匹配填入,避免把序列文件误填进 samples.tsv 等槽位
+ const remaining = [...uploaded];
+ for (const input of lightweightNlRun.inputs) {
+ if (String(input.value || '').trim()) continue;
+ const slotName = String(input.key || '').trim().toLowerCase();
+ const hitIndex = remaining.findIndex(path => {
+ const base = String(path || '').split('/').pop().toLowerCase();
+ return slotName && (base === slotName || base.endsWith('.' + slotName));
+ });
+ if (hitIndex >= 0) {
+ input.value = remaining.splice(hitIndex, 1)[0];
}
}
- ElMessage.success(`已上传 ${uploaded.length} 个文件`);
+ const emptyInputs = lightweightNlRun.inputs.filter(item => !String(item.value || '').trim());
+ for (let i = 0; i < remaining.length && i < emptyInputs.length; i++) {
+ emptyInputs[i].value = remaining[i];
+ }
+ const matched = uploaded.length - remaining.length;
+ ElMessage.success(`已上传 ${uploaded.length} 个文件${matched ? `,已自动匹配 ${matched} 个输入槽` : ''}`);
} catch (err) {
ElMessage.error(err.message || '文件上传失败');
} finally {