You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在dropzone.js中将多个文件追加到FormData实现多文件上传

问题原因
  • FormData追加同名字段时默认会覆盖之前的值,PHP接收多文件上传要求字段名末尾带[]才会解析为数组
  • 原有代码逻辑重复追加文件:既在sending事件中逐个追加文件,又在addItem方法中追加整个文件数组,导致数据混乱
  • 未对FormData做提交后重置,多次提交会带上历史文件
前端修改方案

替换你的Dropzone初始化逻辑即可,核心修改点:

  1. 移除sending事件里的文件追加逻辑,统一在提交时遍历所有选中的文件追加
  2. 追加文件时使用image[]作为键名
  3. 每次提交前新建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 16:27:04