在CodeIgniter框架中实现图片压缩后上传到OSS,需要结合图片处理库和OSS官方SDK完成,整体流程分为环境准备、图片压缩处理、OSS对接上传三个核心部分。
环境准备
首先需要确保CodeIgniter项目已经搭建完成,然后安装OSS PHP SDK,可以通过Composer执行以下命令安装:
composer require aliyuncs/oss-sdk-php
同时需要开启PHP的GD库或者Imagick扩展,用于后续的图片压缩处理,可以在php.ini中开启对应扩展后重启服务。
图片压缩实现
在CodeIgniter中创建图片处理工具类,实现图片压缩功能,核心逻辑是读取原始图片,根据设定的质量参数重新生成图片内容。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Image_compress {
/**
* 压缩图片
* @param string $source_path 原始图片路径
* @param string $target_path 压缩后图片保存路径
* @param int $quality 压缩质量 1-100
* @return bool
*/
public function compress($source_path, $target_path, $quality = 75) {
// 获取图片信息
$img_info = getimagesize($source_path);
if (!$img_info) {
return false;
}
$mime = $img_info['mime'];
// 根据图片类型创建资源
switch ($mime) {
case 'image/jpeg':
$source_img = imagecreatefromjpeg($source_path);
break;
case 'image/png':
$source_img = imagecreatefrompng($source_path);
break;
case 'image/gif':
$source_img = imagecreatefromgif($source_path);
break;
default:
return false;
}
// 压缩并保存图片
if ($mime == 'image/png') {
// png压缩需要特殊处理,quality参数对应压缩级别0-9
$png_quality = 9 - floor($quality / 11);
imagepng($source_img, $target_path, $png_quality);
} else {
imagejpeg($source_img, $target_path, $quality);
}
imagedestroy($source_img);
return file_exists($target_path);
}
}
OSS配置与上传
在CodeIgniter的配置文件目录创建oss.php配置文件,存储OSS的相关配置信息:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$config['oss_access_key_id'] = '你的access_key_id';
$config['oss_access_key_secret'] = '你的access_key_secret';
$config['oss_endpoint'] = '你的endpoint';
$config['oss_bucket'] = '你的bucket名称';
$config['oss_cdn_domain'] = 'https://ipipp.com'; // 替换为你的CDN域名
创建OSS上传工具类,封装上传逻辑:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
use OSSOssClient;
use OSSCoreOssException;
class Oss_upload {
private $oss_client;
private $bucket;
private $cdn_domain;
public function __construct() {
$CI =& get_instance();
$CI->load->config('oss');
$access_key_id = $CI->config->item('oss_access_key_id');
$access_key_secret = $CI->config->item('oss_access_key_secret');
$endpoint = $CI->config->item('oss_endpoint');
$this->bucket = $CI->config->item('oss_bucket');
$this->cdn_domain = $CI->config->item('oss_cdn_domain');
try {
$this->oss_client = new OssClient($access_key_id, $access_key_secret, $endpoint);
} catch (OssException $e) {
log_message('error', 'OSS初始化失败: ' . $e->getMessage());
}
}
/**
* 上传文件到OSS
* @param string $local_path 本地文件路径
* @param string $oss_path OSS中存储路径
* @return string|false 成功返回访问地址 失败返回false
*/
public function upload($local_path, $oss_path) {
if (!file_exists($local_path)) {
return false;
}
try {
$this->oss_client->uploadFile($this->bucket, $oss_path, $local_path);
return rtrim($this->cdn_domain, '/') . '/' . ltrim($oss_path, '/');
} catch (OssException $e) {
log_message('error', 'OSS上传失败: ' . $e->getMessage());
return false;
}
}
}
控制器中整合调用
在上传控制器中整合图片压缩和OSS上传逻辑,处理前端提交的上传请求:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Upload extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->library('image_compress');
$this->load->library('oss_upload');
}
public function image() {
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
echo json_encode(['code' => 400, 'msg' => '请求方式错误']);
return;
}
$file = $_FILES['image'] ?? null;
if (!$file || $file['error'] != 0) {
echo json_encode(['code' => 400, 'msg' => '请选择有效图片']);
return;
}
// 临时存储原始图片
$tmp_dir = FCPATH . 'uploads/tmp/';
if (!is_dir($tmp_dir)) {
mkdir($tmp_dir, 0755, true);
}
$origin_path = $tmp_dir . uniqid() . '_' . $file['name'];
move_uploaded_file($file['tmp_name'], $origin_path);
// 压缩图片
$compress_path = $tmp_dir . 'compress_' . basename($origin_path);
$compress_result = $this->image_compress->compress($origin_path, $compress_path, 70);
if (!$compress_result) {
echo json_encode(['code' => 500, 'msg' => '图片压缩失败']);
return;
}
// 生成OSS存储路径
$oss_dir = 'images/' . date('Ym') . '/';
$oss_path = $oss_dir . basename($compress_path);
// 上传到OSS
$oss_url = $this->oss_upload->upload($compress_path, $oss_path);
if (!$oss_url) {
echo json_encode(['code' => 500, 'msg' => 'OSS上传失败']);
return;
}
// 清理临时文件
unlink($origin_path);
unlink($compress_path);
echo json_encode(['code' => 200, 'msg' => '上传成功', 'data' => ['url' => $oss_url]]);
}
}
注意事项
- 临时目录需要设置正确的读写权限,避免文件操作失败
- OSS的access_key_secret等敏感信息不要直接写在代码中,建议通过环境变量或者加密配置文件存储
- 可以根据业务需求调整压缩质量参数,平衡图片大小和清晰度
- 上传前可以添加图片格式、大小校验,避免无效文件上传
CodeIgniterOSS图片压缩云存储对接修改时间:2026-06-15 22:00:30