本地图切OSS,tigshop开源商城存储驱动切换记录

新装的站点,商品图默认存本地。单机跑没问题,等客户要上负载均衡、图片走 CDN,本地存储就不行了,两台机器各存各的,图片对不齐。把存储切到阿里云 OSS 的过程记一下。

先看清楚代码里怎么选驱动。上传统一走 php/app/service/admin/file/FileStorage.php,它根据配置 storageType 决定用哪个驱动:

php 复制代码
// FileStorage.php 构造里
$storage_type = Config::get('storageType');
switch ($storage_type) {
    case 0:  // 本地
        $this->storageClass = app(Local::class);
        break;
    case 1:  // OSS
        $this->storageClass = app(Oss::class);
        break;
    case 2:  // Cos,注意这块是空的
        break;
}

驱动类在 php/app/service/admin/file/src/ 下,本地是 Local.php,OSS 是 Oss.php。这里有个得先知道的坑:case 2(腾讯云 COS)在这版开源里是空的,没实现 。也就是说后台就算让你选 COS,实际也走不通。客户非要用腾讯云 COS 的话,得自己照着 Oss.php 写一个 Cos.php 补上,别以为后台有选项就等于能用。下面按能直接用的阿里云 OSS 来。

云厂商侧先备齐

阿里云建好 bucket,读写权限按需给,生成一对 AccessKey。有个安全习惯:这对密钥的权限只授到这一个 bucket,别图省事挂个全账号权限,万一泄露波及整个云账号。

后台填配置

存储配置在后台 设置 → 存储设置 ,把存储方式从「本地」切成 OSS,填 bucket 名、地域(endpoint)、访问域名和刚才那对密钥。对着 Oss.php 看,它读的就是这几个配置项:

php 复制代码
// php/app/service/admin/file/src/Oss.php
$accessKeyId = Config::get('storageAccessKeyId');
$accessKeySecret = Config::get('storageAccessKeySecret');
$bucket = Config::get('storageBucket');
$endpoint = Config::get('storageRegion');   // 这里用的是地域 endpoint
$this->ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

访问域名务必用 HTTPS。商城是 https 站,图片走 http 会被浏览器当成混合内容拦掉,表现就是图直接裂。

关于跨域,看你走哪种上传

默认的上传是服务端中转 :图片先传到 PHP 服务器,再由 PHP 用 OSS SDK(ossClient->uploadFile)传到 bucket。这条路是服务器和 OSS 之间通信,不经过浏览器,所以不用配 bucket 跨域。

只有当你二开成前端 H5 直传 OSS(浏览器直接 PUT 到 bucket)时,才需要在 bucket 跨域设置里把商城域名加进允许来源、放行 PUT/POST。没改成直传就不用折腾这个。

传一张图验证

后台随便上传一张商品图,看返回路径是不是已经指向 OSS。是了说明驱动切过来了,之后新上传的图都往 OSS 走。

存量老图要单独处理

这步最容易忘:切驱动只对切换之后上传的图生效,之前存在本地的老图不会自动搬过去。不处理的话,新图正常、老商品图集体裂开,看着吓人其实就是这个原因。两种补法,要么写个脚本把本地老文件同步到 OSS 再刷一遍库里的路径,要么在 Nginx 上给老图路径做个 301 兜到 OSS 域名。先在测试环境验证同步没漏文件,再上正式。

相关推荐
冬奇Lab5 小时前
开源项目第242期:HyperFrames —— 写 HTML 就能渲染视频,专为 AI Agent 设计的确定性视频框架
人工智能·开源·音视频开发
AI日报派送佬6 小时前
2026年10月19日AI行业日报|三星联合台积电代工英伟达HBM裸片,智谱开源法律大模型,清华发布智能体操作系统PilotDeck 2.0
人工智能·开源·英伟达·智能体·anthropic·ai日报·法律大模型
Tangyuewei6 小时前
小米的 Coding Agent 开源了
人工智能·开源·ai编程
程序员老赵8 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
TTATTC8 小时前
为什么单会话聊天做不好复杂工程?Claude Code 创作者的并发 Worktree 与记忆闭环实践
docker·开源
TTATTC8 小时前
状态机驱动长事务,还是 DAG 编排高并发?高可靠业务流程引擎的双核架构设计
docker·开源
钱栈up8 小时前
GitHub 热榜实测|REA:用 Agent 逆向一切
typescript·开源·github
字节跳动开源9 小时前
ByteDance 2026 上半年 Linux 内核贡献回顾
linux·开源
阿里云云原生12 小时前
云栖实录丨面向 AgenticOps 的开源建设:采集标准化、统一语义建模与能力评测
云原生·开源
鶴哥只手遮天12 小时前
Spring AI 2.0.1 深度解析-第 22 章 Spring Boot 集成:自动配置、Properties 与条件装配
java·人工智能·开源