如何在dropzone.js中将多个文件追加到FormData实现多文件上传
问题原因
- FormData追加同名字段时默认会覆盖之前的值,PHP接收多文件上传要求字段名末尾带
[]才会解析为数组 - 原有代码逻辑重复追加文件:既在
sending事件中逐个追加文件,又在addItem方法中追加整个文件数组,导致数据混乱 - 未对FormData做提交后重置,多次提交会带上历史文件
前端修改方案
替换你的Dropzone初始化逻辑即可,核心修改点:
- 移除
sending事件里的文件追加逻辑,统一在提交时遍历所有选中的文件追加 - 追加文件时使用
image[]作为键名 - 每次提交前新建FormData实例,避免历史数据污染
$(document).ready(function(){ $("#food-images").dropzone({ dictDefaultMessage: "Food Images, multiple or single", clickable: true, url: "#", maxFiles: 10, maxFilesize: 3, addRemoveLinks: true, uploadMultiple: true, parallelUploads:10, autoProcessQueue: false, // 关闭自动上传,走自定义提交逻辑 init: function(){ var mydropzone = this; $scope.addItem = ()=>{ // 每次提交新建FormData,避免历史数据污染 let fd = new FormData(); let name = $scope.name; let description = $scope.description; let cat = $scope.cat; let price = $scope.price; let postfields = JSON.stringify({"name":name,"description":description,"cat":cat,"price":price}); fd.append("data",postfields); // 遍历所有选中的文件,用image[]作为键名追加 if(mydropzone.files.length > 0){ mydropzone.files.forEach(file => { fd.append("image[]", file); }) } let api = (window.location.origin)+"/adddish"; $http({ method:"post", url:api, data:fd, headers: {"Content-Type":undefined} }).then((rez)=>{ console.log(rez); // 提交成功后清空dropzone选中的文件,按需开启 // mydropzone.removeAllFiles(); }) } } }); })
PHP端接收说明
修改后$_FILES['image']会自动变为多维数组,包含所有上传的文件信息,直接遍历处理即可,示例代码如下:
public function doAddDish(){ $files = $_FILES['image'] ?? []; // 多文件时$files是多维数组,遍历获取每个文件的信息 $fileList = []; if(!empty($files['name'])){ for($i=0; $i<count($files['name']); $i++){ $fileList[] = [ 'name' => $files['name'][$i], 'type' => $files['type'][$i], 'tmp_name' => $files['tmp_name'][$i], 'error' => $files['error'][$i], 'size' => $files['size'][$i] ]; } } echo json_encode($fileList); }
内容的提问来源于stack exchange,提问作者Noble Eugene
相关产品推荐
相关产品推荐

