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

Blueimp File Upload:批量上传时仅向albums表插入单条数据问题

解决批量上传时仅插入一条相册记录的问题

你的问题根源在于 handle_file_upload 方法会为每一个上传的文件执行一次,所以每上传一张照片就会向 albums 表插入一条数据,批量上传5张就会生成5条相册记录。我们可以通过在类中添加一个成员变量来存储已创建的相册ID,仅在处理第一个上传文件时创建相册,后续所有照片都关联这个相册ID。

修改后的代码

class CustomUploadHandler extends UploadHandler {
    // 添加成员变量存储相册ID和相册信息
    private $album_id = null;
    private $album_title = '';
    private $album_description = '';

    protected function initialize() {
        $this->db = new mysqli(
            $this->options['db_host'],
            $this->options['db_user'],
            $this->options['db_pass'],
            $this->options['db_name']
        );
        parent::initialize();
        // 移除这里的数据库关闭操作,后续方法还需要使用连接
        // $this->db->close(); 
    }

    protected function handle_form_data($file, $index) {
        $file->title = @$_REQUEST['title'][$index];
        $file->description = @$_REQUEST['description'][$index];
        // 仅从第一个文件获取相册的标题和描述(批量上传时相册信息应该统一)
        if ($index === 0) {
            $this->album_title = $file->title;
            $this->album_description = $file->description;
        }
    }

    protected function handle_file_upload($uploaded_file, $name, $size, $type, $error, $index = null, $content_range = null) {
        $file = parent::handle_file_upload(
            $uploaded_file, $name, $size, $type, $error, $index, $content_range
        );

        if (empty($file->error)) {
            // 仅在处理第一个文件时创建相册,避免重复插入
            if ($this->album_id === null && $index === 0) {
                $sql2 = 'INSERT INTO `albums` (`album_title`, `album_description`) VALUES (?,?)';
                $query2 = $this->db->prepare($sql2);
                $query2->bind_param('ss', $this->album_title, $this->album_description);
                $query2->execute();
                $this->album_id = $this->db->insert_id;
                $query2->close();
            }

            // 修改photos表的插入语句,添加album_id外键关联相册
            $sql = 'INSERT INTO `'.$this->options['db_table'] .'` (`name`, `size`, `type`, `title`, `description`, `album_id`)'
                .' VALUES (?,?, ?, ?, ?, ?)';
            $query = $this->db->prepare($sql);
            $query->bind_param(
                'sisssi',
                $file->name,
                $file->size,
                $file->type,
                $file->title,
                $file->description,
                $this->album_id
            );
            $query->execute();
            $file->id = $this->db->insert_id;
            $query->close();
        }
        return $file;
    }

    // 在类销毁时关闭数据库连接,确保资源释放
    public function __destruct() {
        if (isset($this->db) && $this->db instanceof mysqli) {
            $this->db->close();
        }
    }
}

关键修改说明

  1. 新增成员变量:用 $album_id 存储已创建的相册ID,$album_title 和 $album_description 存储统一的相册信息(取自第一个上传文件的表单数据)。
  2. 调整数据库连接生命周期:把数据库连接关闭操作移到类的析构函数中,避免初始化后直接关闭导致后续操作报错。
  3. 单次相册插入逻辑:通过 $this->album_id === null 和 $index === 0 的双重判断,确保只有第一个上传的文件会触发相册插入操作。
  4. 关联外键:修改 photos 表的插入SQL,加入 album_id 字段,让所有批量上传的照片都关联到同一个相册。

注意事项

  • 请确保你的 photos 表已经添加了 album_id 字段,并且设置为外键关联 albums 表的主键(通常是 id 字段)。
  • 如果相册信息不需要和照片标题/描述复用,建议在表单中单独添加 album_title、album_description 字段,逻辑会更清晰。

内容的提问来源于stack exchange,提问作者Prince Brucex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:12:13