Laravel 5.6中AJAX上传CSV文件失败:提示文件必填
解决Laravel 5.6 AJAX上传CSV时“文件为必填项”的问题
我一眼就发现了核心问题——你的AJAX代码里创建FormData的写法有误,导致表单文件根本没被正确传递到后端!
问题根源
你写的var formData = new FormData($('this')[0]);是错误的:jQuery中$('this')会去查找标签名为<this>的元素,而不是指向当前触发submit事件的表单对象。这就导致FormData是空的,后端自然会提示“文件为必填项”。
分步解决方案
1. 修正FormData创建逻辑
把创建FormData的代码改成以下两种方式之一:
- 直接使用原生表单对象(推荐):
var formData = new FormData(this); - 或者用jQuery转原生DOM元素:
var formData = new FormData($(this)[0]);
这样FormData就能正确读取表单里的所有数据(包括你选择的CSV文件)。
2. 优化按钮启用逻辑(可选但推荐)
你的提交按钮默认是禁用状态,建议添加文件选择事件,当用户选中文件后再启用按钮,避免无效提交:
$('#import_file').on('change', function() { // 有文件就启用按钮,否则禁用 $('#upload_csv').prop('disabled', !$(this).val()); });
3. 调试后端接收(可选)
如果还是有问题,可以在控制器里先打印请求数据确认文件是否被传递:
// 在验证之前添加 dd($request->file('import_file'));
如果输出是Illuminate\Http\UploadedFile对象,说明文件已经正确传递了。
修正后的完整AJAX代码
$(document).ready(function(){ // 文件选择时切换按钮状态 $('#import_file').on('change', function() { $('#upload_csv').prop('disabled', !$(this).val()); }); $('form').submit(function(event){ event.preventDefault(); // 正确创建FormData var formData = new FormData(this); $.ajax({ headers: { 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') }, url: "{{url('admin/voter/sub/storecsv')}}", data: formData, type: 'post', async: false, processData: false, contentType: false, success:function(response){ alert('uploaded'); }, error: function(xhr) { // 新增错误调试,方便排查问题 console.log('上传失败:', xhr.responseText); } }); }); });
内容的提问来源于stack exchange,提问作者Aayush Dahal
相关产品推荐
相关产品推荐

