CodeIgniter实现多文件批量上传与双尺寸缩略图生成

唐可
唐可
发布时间:2026-10-14| 2人浏览过
原创

在Web开发中,相册功能常需同时处理多张图片上传及后续的尺寸调整。本方案基于CodeIgniter框架,演示如何通过一次请求完成5张图片的批量上传,利用系统内置的图像库自动生成170x170和600x600两种缩略图,并将记录写入MySQL数据库。

实现目标与核心逻辑

该功能主要解决以下三个需求:

  • 批量上传:允许用户一次性提交最多5张图片。
  • 双尺寸生成:上传成功后,自动为每张图片创建标准小图和大幅大图两个版本。
  • 数据持久化:将文件路径、上传时间等信息保存到数据库中。

准备条件

  1. 已安装并配置好的 CodeIgniter 环境。
  2. 确保服务器安装了 GD2 图像扩展库,这是代码中明确指定的图像处理引擎。
  3. 在磁盘上创建对应的文件夹结构:
    • album/source/:存放原始上传图片。
    • album/thumb/:存放170px缩略图。
    • album/large/:存放600px大图。
  4. 数据库中存在 album 表,包含字段如 filename, uid, dateline 等。

第1步:构建前端上传表单

为了支持多文件选择,视图层需定义多个 <input type="file"> 元素,并设置正确的表单编码类型。

入口操作:创建或编辑视图文件(如 new_pic.view.php)。

  1. 初始化一个 POST 表单,务必添加属性 enctype="multipart/form-data" 以支持二进制文件传输。
  2. 定义5个文件输入框,名称分别命名为 image1 到 image5,以便后端通过命名索引进行识别。
<form method="post" action="<?php echo site_url() ?>photo/upload/go/<?php echo $albumID ?>" enctype="multipart/form-data">
  <input type="file" name="image1" class="files"/><br />
  <input type="file" name="image2" class="files"/><br />
  <input type="file" name="image3" class="files"/><br />
  <input type="file" name="image4" class="files"/><br />
  <input type="file" name="image5" class="files"/><br />
  <p><input type="submit" name="go" value="上传照片" class="button" /></p>
</form>

第2步:配置上传与图像处理参数

控制器是核心逻辑所在,需在动作方法中初始化上传库和图像库的配置数组。

入口操作:打开 controllers/upload.php 中的 go() 方法。

  1. 配置上传参数:设置允许的扩展名(gif|jpg|png|bmp|jpeg),启用文件名加密以防止冲突,并设定文件大小限制(示例中设为0即不限制)。
  2. 配置第一组缩略图(170x170):
    • 设置 image_library 为 'gd2'。
    • 启用 create_thumb 保持比例 maintain_ratio。
    • 指定输出路径 new_image 为 album/thumb。
    • 设定宽度和高度均为 170。
  3. 配置第二组缩略图(600x600):逻辑同上,但修改 new_image 为 album/large,宽高设为 600。
$config['upload_path'] = 'album/source';
$config['allowed_types'] = 'gif|jpg|png|bmp|jpeg';
$config['encrypt_name'] = TRUE;
$config['remove_spaces'] = TRUE;
// 其他限制可设为0或不设
$this->load->library('upload', $config);

// 170x170 配置
$configThumb = array();
$configThumb['image_library'] = 'gd2';
$configThumb['create_thumb'] = TRUE;
$configThumb['maintain_ratio'] = TRUE;
$configThumb['new_image'] = 'album/thumb';
$configThumb['width'] = 170;
$configThumb['height'] = 170;

// 600x600 配置
$configLarge = array();
$configLarge['image_library'] = 'gd2';
$configLarge['create_thumb'] = TRUE;
$configLarge['maintain_ratio'] = TRUE;
$configLarge['new_image'] = 'album/large';
$configLarge['width'] = 600;
$configLarge['height'] = 600;

$this->load->library('image_lib');

第3步:循环处理文件与生成缩略图

使用循环遍历每个可能的文件输入框。对于每个文件,先执行上传,成功后再依次调用两次图像库的初始化和调整操作。

入口操作:在控制器的 for 循环中进行。

  1. 尝试上传:调用 $this->upload->do_upload('image' . $i)。若返回 FALSE(例如无文件或格式错误),则跳过本次循环。
  2. 获取文件信息:上传成功后,通过 $this->upload->data() 获取文件的完整路径 full_path 和文件名 file_name。
  3. 生成缩略图:
    • 为小图配置设置 source_image 为当前上传文件的 full_path,调用 initialize() 后执行 resize()。
    • 为大图配置同样设置 source_image,重新 initialize() 后再次执行 resize()。
  4. 注意性能优化:每次处理新图片前,必须为新的 source_image 重新初始化图像库,否则可能会引用旧路径或产生未定义行为。
for($i = 1; $i < 6; $i++) {
    $upload = $this->upload->do_upload('image'.$i);
    if($upload === FALSE) continue;
    
    $data = $this->upload->data();
    
    // 仅对图像进行处理
    if($data['is_image'] == 1) {
        // 生成170x170缩略图
        $configThumb['source_image'] = $data['full_path'];
        $this->image_lib->initialize($configThumb);
        $this->image_lib->resize();
        
        // 生成600x600大图
        $configLarge['source_image'] = $data['full_path'];
        $this->image_lib->initialize($configLarge);
        $this->image_lib->resize();
    }
    // ... 后续数据库插入逻辑
}

第4步:保存数据至数据库

在处理完单个图片的所有操作后,构建一个包含必要信息的数组,并通过模型层将其存入数据库。

  1. 构造数组 $picture,至少包含:
    • filename:原始文件名。
    • albumID:从URL段获取的相册ID。
    • uid:从Session中获取的用户ID。
    • dateline:当前时间戳。
  2. 加载模型(如 album_model)并调用添加图片的方法(如 AddPic)。
$picture = array(
    'filename' => $data['file_name'],
    'albumID' => $this->uri->segment(4, 0),
    'uid' => $this->session->userdata('uid'),
    'dateline' => time(),
    'describe' => '',
    'click' => 0
);
$this->load->model('album_model');
$this->album_model->AddPic($picture);

完成判断与排错指南

成功标志:

  • 页面重定向回相册编辑页,且显示“图片上传成功”的消息提示。
  • 在 album/source、thumb 和 large 目录下分别生成了对应的文件。
  • 数据库 album 表中增加了相应的记录。

常见问题排查:

  1. 图像库错误(libgd error):检查服务器是否已启用GD库,且 $configThumb['image_library'] 设置的值(如 gd2)必须在 application/config/mimes.php 或系统默认配置中正确映射。
  2. 权限问题:确保 album 及其子目录具有可写权限(通常需设置为 755 或 775,取决于服务器运行账户)。
  3. 缩略图文件名重复:默认情况下,缩略图会添加后缀(如 _thumb.jpg)。若希望保留原文件名,需在上传配置中添加 $config['thumb_marker'] = '';(注:此参数视CI版本而定,高版本可能略有差异)。
  4. 内存溢出:批量处理高分辨率图片可能导致PHP内存不足。可在脚本开头适当增加 ini_set('memory_limit', '128M');。

简要总结

本教程展示了利用CodeIgniter原生组件实现高效批量图片处理的标准流程。关键在于分离上传配置与图像配置,并在循环中对每张图片独立初始化图像库路径。该方法结构清晰,易于扩展到更多尺寸或不同类型的媒体文件处理。

以上就是CodeIgniter实现多文件上传并创建多个缩略图的详细内容,更多关于CodeIgniter多图片处理、PHP图像生成的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。