AJAX上传文件时$_POST与$_FILES返回空数组问题排查
问题根源:错误地将FormData转为普通对象传递
你遇到的核心问题是把FormData对象转换成了普通JavaScript对象slides_data,然后用这个普通对象作为AJAX的data参数——这直接破坏了文件上传所需的multipart/form-data数据结构,后端自然无法解析出$_POST和$_FILES数据。
具体错误代码分析
看你这段关键代码:
var slides_data = {}; slides_data['product_id'] = product_id; slides_form_data.forEach(function(val, key) { slides_data[key] = val });
FormData是专门用于处理文件上传的特殊对象,它会自动封装符合multipart/form-data格式的数据(包括文件二进制流)。但你把它转成普通对象后,文件二进制数据会丢失,整个请求的格式也不再符合后端解析要求,最终导致$_POST和$_FILES返回空数组。
修正方案:直接传递FormData对象
你只需要去掉转换普通对象的步骤,直接把slides_form_data作为AJAX的data参数即可。另外你已经通过slides_form_data.append('product-id', product_id)把产品ID加入了FormData,不需要再单独处理。
修正后的AJAX代码如下:
$.ajax({ data: slides_form_data, // 直接使用FormData对象 dataType: 'text', type: 'post', url: PLUGIN_ROOT+ 'admin/inc/scripts/add-product-slides.php', cache: false, contentType: false, processData: false, success: function(res) {console.log(res)}, error: function(res) {$.fn.showPopup(2, 'Something went wrong. Please try again.', res)} });
额外检查点
- 你的表单已经正确设置了
enctype="multipart/form-data",这部分没问题。 - 后端PHP文件要确保没有全局清空
$_POST/$_FILES的操作(比如某些安全过滤插件的影响)。 - 注意你代码里的
slides对象目前是空的,因为你遍历input时只处理了files但没往slides里添加内容,不过这是功能逻辑问题,不影响当前的上传数据接收。
内容的提问来源于stack exchange,提问作者treyBake
相关产品推荐
相关产品推荐

