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(); } } }
关键修改说明
- 新增成员变量:用
$album_id存储已创建的相册ID,$album_title和$album_description存储统一的相册信息(取自第一个上传文件的表单数据)。 - 调整数据库连接生命周期:把数据库连接关闭操作移到类的析构函数中,避免初始化后直接关闭导致后续操作报错。
- 单次相册插入逻辑:通过
$this->album_id === null和$index === 0的双重判断,确保只有第一个上传的文件会触发相册插入操作。 - 关联外键:修改
photos表的插入SQL,加入album_id字段,让所有批量上传的照片都关联到同一个相册。
注意事项
- 请确保你的
photos表已经添加了album_id字段,并且设置为外键关联albums表的主键(通常是id字段)。 - 如果相册信息不需要和照片标题/描述复用,建议在表单中单独添加
album_title、album_description字段,逻辑会更清晰。
内容的提问来源于stack exchange,提问作者Prince Brucex
相关产品推荐
相关产品推荐

