如何批量上传文件夹图片至服务器?服务端接收数组为空问题求助
文件夹图片上传后端接收为空的问题解决
问题现象
使用带directory属性的文件选择框上传文件夹内所有图片,前端通过FormData提交后,后端PHP的$_FILES['flist']为空,报错Undefined array key "flist",无法完成图片保存。
错误原因
- 前端FormData处理错误:直接将
FileList对象整体append到FormData中,PHP无法识别。需要逐个添加文件,并且键名要加[]后缀,让PHP解析为数组。 - 前端Ajax配置冲突:重复设置了
contentType: 'multipart/form-data'和contentType: false,后者才是正确的(让浏览器自动设置multipart头)。 - 后端遍历逻辑错误:PHP接收多文件时,
$_FILES['flist']的结构是每个属性(如name、tmp_name)为数组,而非每个元素是单个文件的完整信息数组。
修正后的代码
前端HTML(无需修改)
<input type='file' class='inpfile' id='inpfo' webkitdirectory='' directory='' multiple='true'>
前端JS
var inpfo = $('#inpfo'); inpfo.on('change', function(){ var flist = inpfo[0].files; var fd = new FormData(); // 逐个添加文件到FormData,键名加[]让PHP识别为数组 for(var i = 0; i < flist.length; i++){ fd.append('flist[]', flist[i]); } $.ajax({ url: 'upload.php', type: 'POST', data: fd, async: false, success: function (data){ console.log(data); }, cache: false, contentType: false, // 仅保留此配置,让浏览器自动处理multipart头 processData: false }); });
后端upload.php
// 先判断是否接收到有效文件 if(isset($_FILES['flist']) && !empty($_FILES['flist']['tmp_name'][0])){ $files = $_FILES['flist']; // 按索引遍历每个文件 for($i = 0; $i < count($files['tmp_name']); $i++){ $tempname = $files['tmp_name'][$i]; $fileType = $files['type'][$i]; // 仅处理jpg/jpeg格式的图片 if(in_array($fileType, ['image/jpeg', 'image/jpg'])){ // 验证是否为合法上传文件 if(is_uploaded_file($tempname)){ $uniq = uniqid(); $targ = 'test/' . $uniq . '.jpg'; $img = imagecreatefromjpeg($tempname); if($img){ imagejpeg($img, $targ); imagedestroy($img); // 释放图片资源 } } } } echo '上传成功'; }else{ echo '未接收到有效文件'; }
额外注意事项
- 确保服务器端
test目录存在且拥有写入权限(可通过chmod 755 test命令设置)。 - 建议将
async: false改为async: true,避免阻塞浏览器影响用户体验。 - 可根据需求添加文件大小限制、支持更多图片格式(如png)等逻辑。
内容的提问来源于stack exchange,提问作者provance
相关产品推荐
相关产品推荐

