You need to enable JavaScript to run this app. 如何将file类型输入值存入隐藏域用于AJAX提交并解决返回[object FileList]问题
优惠活动
大模型
产品
解决方案
定价
更多

如何将file类型输入值存入隐藏域用于AJAX提交并解决返回[object FileList]问题

问题根因
  • 隐藏输入框的value仅支持存储字符串类型,你将FileList文件对象直接赋值给隐藏输入框时,JS会自动调用对象的toString()方法转成"[object FileList]"字符串,无法传递真实文件资源
  • 后端获取文件的写法也有错误,没有调用Laravel提供的文件读取方法
  • 原提交逻辑里重置文件输入框的选择器拼写错误,缺少#选择符
解决方案

第一步:移除隐藏输入框中转逻辑,用变量缓存选中的文件

文件对象属于JS二进制引用类型,无法序列化存入输入框,直接用全局变量缓存即可:

// 全局变量缓存选中的Excel文件
let selectedExcel = null;
document.getElementById('file').onchange = function() {
    // 取用户选中的第一个文件
    selectedExcel = this.files[0];
};

第二步:修改AJAX提交逻辑

直接将缓存的文件对象插入FormData提交,不要读取隐藏输入框的值:

// 非空校验
if (!selectedExcel) {
    alert('请先选择Excel文件');
    return;
}
const formData = new FormData();
// 直接插入文件对象
formData.append('file', selectedExcel);

$.ajax({
    url: "{{ route('admin.handle-import') }}",
    headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
    method: "POST",
    data: formData,
    processData: false,
    contentType: false,
    success: function(res) {
         // 修正选择器拼写错误,重置文件输入框
         $('#file').val('');
         // 清空缓存的文件
         selectedExcel = null;
    }
});

第三步:修正后端文件读取逻辑

Laravel中需要调用file()方法读取上传的文件资源:

// 原写法错误,仅能读取普通字符串参数
// $file = $request->file;
// 正确写法
$file = $request->file('file');

后续就可以用$file->store()等方法处理Excel文件了。

补充说明

以上逻辑已经可以避免ERR_UPLOAD_FILE_CHANGED错误:我们提交的是提前缓存好的文件对象,提交完成后才重置文件输入框,不会出现提交过程中文件被修改的问题。


内容的提问来源于stack exchange,提问作者Tomato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 07:42:02