CodeIgniter实现多文件批量上传与双尺寸缩略图生成
在Web开发中,相册功能常需同时处理多张图片上传及后续的尺寸调整。本方案基于CodeIgniter框架,演示如何通过一次请求完成5张图片的批量上传,利用系统内置的图像库自动生成170x170和600x600两种缩略图,并将记录写入MySQL数据库。
实现目标与核心逻辑
该功能主要解决以下三个需求:
- 批量上传:允许用户一次性提交最多5张图片。
- 双尺寸生成:上传成功后,自动为每张图片创建标准小图和大幅大图两个版本。
- 数据持久化:将文件路径、上传时间等信息保存到数据库中。
准备条件
- 已安装并配置好的
CodeIgniter环境。 - 确保服务器安装了
GD2图像扩展库,这是代码中明确指定的图像处理引擎。 - 在磁盘上创建对应的文件夹结构:
album/source/:存放原始上传图片。album/thumb/:存放170px缩略图。album/large/:存放600px大图。
- 数据库中存在
album表,包含字段如filename,uid,dateline等。
第1步:构建前端上传表单
为了支持多文件选择,视图层需定义多个 <input type="file"> 元素,并设置正确的表单编码类型。
入口操作:创建或编辑视图文件(如 new_pic.view.php)。
- 初始化一个
POST表单,务必添加属性enctype="multipart/form-data"以支持二进制文件传输。 - 定义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() 方法。
- 配置上传参数:设置允许的扩展名(gif|jpg|png|bmp|jpeg),启用文件名加密以防止冲突,并设定文件大小限制(示例中设为0即不限制)。
- 配置第一组缩略图(170x170):
- 设置
image_library为'gd2'。 - 启用
create_thumb保持比例maintain_ratio。 - 指定输出路径
new_image为album/thumb。 - 设定宽度和高度均为
170。
- 设置
- 配置第二组缩略图(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 循环中进行。
- 尝试上传:调用
$this->upload->do_upload('image' . $i)。若返回FALSE(例如无文件或格式错误),则跳过本次循环。 - 获取文件信息:上传成功后,通过
$this->upload->data()获取文件的完整路径full_path和文件名file_name。 - 生成缩略图:
- 为小图配置设置
source_image为当前上传文件的full_path,调用initialize()后执行resize()。 - 为大图配置同样设置
source_image,重新initialize()后再次执行resize()。
- 为小图配置设置
- 注意性能优化:每次处理新图片前,必须为新的
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步:保存数据至数据库
在处理完单个图片的所有操作后,构建一个包含必要信息的数组,并通过模型层将其存入数据库。
- 构造数组
$picture,至少包含:filename:原始文件名。albumID:从URL段获取的相册ID。uid:从Session中获取的用户ID。dateline:当前时间戳。
- 加载模型(如
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表中增加了相应的记录。
常见问题排查:
- 图像库错误(libgd error):检查服务器是否已启用GD库,且
$configThumb['image_library']设置的值(如gd2)必须在application/config/mimes.php或系统默认配置中正确映射。 - 权限问题:确保
album及其子目录具有可写权限(通常需设置为755或775,取决于服务器运行账户)。 - 缩略图文件名重复:默认情况下,缩略图会添加后缀(如
_thumb.jpg)。若希望保留原文件名,需在上传配置中添加$config['thumb_marker'] = '';(注:此参数视CI版本而定,高版本可能略有差异)。 - 内存溢出:批量处理高分辨率图片可能导致PHP内存不足。可在脚本开头适当增加
ini_set('memory_limit', '128M');。
简要总结
本教程展示了利用CodeIgniter原生组件实现高效批量图片处理的标准流程。关键在于分离上传配置与图像配置,并在循环中对每张图片独立初始化图像库路径。该方法结构清晰,易于扩展到更多尺寸或不同类型的媒体文件处理。
以上就是CodeIgniter实现多文件上传并创建多个缩略图的详细内容,更多关于CodeIgniter多图片处理、PHP图像生成的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









