开源更新:LitePic 轻量图床 V2.3.0 —— 私有桶终于能用了,外链能缩短,图片能打包带走
上版预告的三个功能,这次全部落地:私有桶临时签名 URL、短链与点击统计、批量打包下载。
另外修了两个老问题,其中一个是 http 部署的 MinIO / 内网 S3 根本传不上图。
开发者:云智Cloud | 协议:MIT(保留署名即可自由使用 / 修改 / 分发)
依然是纯 PHP、零 Composer 依赖、宝塔上传即用。图片索引还是自执行 PHP 文件,用户 / 分组数据用 MySQL。
V2.3.0 没有新增数据库表 / 字段,不用导 litepic.sql、不用点「修复数据表」。
新增 2 个 config.php 配置项(s3_private、s3_sign_expire),旧配置缺这两项时按「公开桶 + 3600 秒」处理,完全兼容。
一、私有桶:以前是「半截功能」,这次才真正能用
先说个之前没讲清楚的坑。旧版「上传时设为公开读」这个开关,关掉之后程序只是不写 public-read 这个头,但并没有任何签名能力——对象变成私有,外链却没有鉴权,结果就是图片全部 403。等于私有桶压根不可用,勾了反而更糟。
V2.3.0 把整条链路补齐了:
1、后台「云存储设置」新增「私有桶模式」开关和「签名有效期」(默认 3600 秒,可填 60 ~ 604800)。开启后上传对象不带 public-read,桶可以彻底设为私有。
2、新增 img.php 站内代理。这里有个设计要点:AWS 预签名地址是会过期的,如果直接把签名地址写进索引,几小时后全站外链会集体失效。所以索引里保存的是「你的域名/img.php?k=2026/11/xxx.png」这种永不过期的站内地址,每次访问时才现场算 SigV4 签名并 302 跳转。签名从不落盘,外链永远有效。
3、代理不是随便签。img.php 只接受 年/月/文件名 格式的 key,而且必须命中图片索引(原图 / 缩略图 / WebP 三者之一),不会被当成「桶内任意对象」的签名代理来遍历你的私有文件。
4、切换公开 / 私有桶、改自定义域名后,保存设置会自动刷新全部云端图片的存量外链,旧图不会突然打不开;也可以点「刷新存量外链」手动补一次。全站输出点(后台图片管理、画廊、我的图片、API、短链、上传响应)统一走 lp_public_url() 动态生成,不再各自读索引里的死地址。
5、「测试连接」在私有模式下自动换成预签名 GET 校验(PUT → 签名 GET → DELETE),回显 HTTP 码和厂商原始报错。以前那步必然失败的匿名 GET 不会再误报成「配置错了」。
两个必须注意的限制,别踩:
· 私有桶模式下 自定义域名 / CDN 不生效。SigV4 要求请求 Host 和签名 Host 一致,程序会直接用 Endpoint 生成签名地址;CDN 如果改写回源 Host,签名就对不上。想用 CDN 请走公开桶。
· 每次图片访问会多读一次索引来校验 key,图片量特别大时建议公开桶 + CDN。
验收:开启私有桶后传一张图,复制外链,隔一天再打开,能正常显示就对了。
二、短链与点击统计
后台新增「短链统计」区块:
· 给任意图片生成短链,可自定义后缀(2-32 位字母 / 数字 / 下划线 / 连字符),留空自动生成 6 位;admin、api、img 这类系统保留字会被拒绝,避免和站内入口撞名。
· 默认地址是 你的域名/i.php?c=abc123,无需任何伪静态,宝塔开箱即用。想要 /i/abc123 这种更短的,Nginx 加一句 rewrite(见第六步),Apache 的 .htaccess 已经内置。
· 每次访问累计点击数、记录最后访问时间,后台列表里直接看;短链可随时启用 / 停用 / 删除,停用或删掉之后已经发出去的地址立刻返回 404。
· 数据存 data/shortlinks.php(自执行 PHP 文件,直接访问零输出),沿用上版的 flock 互斥写,并发点击不会丢计数,不新增数据库表。
· API 多了 action=shortlink(需有效 Token),可以脚本化批量生成:
curl -X POST "你的域名/api.php?action=shortlink" -d "id=图片ID&code=banner2026" -H "Authorization: Bearer 你的Token"
三、批量打包下载
后台「图片管理」勾选几张图,点「打包下载选中(ZIP)」就导出一个压缩包。
· 纯 PHP 手写 ZIP(store 模式),不依赖 ZipArchive 扩展——有些宝塔 PHP 环境没装这个扩展,为了不给人添麻烦干脆自己写。图片本身已经是压缩格式,再压一次也不会小多少。
· 云端对象会先用签名 GET 拉回来再入包,私有桶照样能打包;文件已设置 UTF-8 文件名标志,中文名不乱码。
· 同名文件自动加 (2)(3) 序号,不会在包里互相覆盖;某张图本地缺失或云端下载失败只跳过这一张,不中断整包。
· 限制:一次最多 50 张、单张 8MB、单包 64MB,避免 PHP 超时和内存爆掉。需要管理员登录 + CSRF 校验。
四、顺带修掉的两个真实缺陷
1、lp_s3_url() 以前硬编码 http:// 部署的 MinIO、内网 S3、部分自建对象存储,上传和签名会全部失败(而且报错看起来像权限问题,很难查)。现在跟随 Endpoint 填的协议,填 http:// 就走 http。
2、后台筛选参数、云存储测试表单在遇到 ?q[]=1 这种数组参数时会触发 Array to string 警告,污染输出。现在统一走标量安全取值。
另外环境自检新增「私有桶签名代理」「批量打包下载」两项,配置冲突(私有桶 + 自定义域名)会直接标红并给出修复建议。
五、V2.2 → V2.3 升级步骤(老用户看这里,纯文本逐条)
第 1 步 · 备份
把站点根目录整体打包下载,重点是 config.php、data/、uploads/。
第 2 步 · 覆盖上传
把 V2.3.0 压缩包解压到站点根目录覆盖(解压即根目录,不要套一层文件夹)。
务必保留 config.php、data/、uploads/ 这三个,不要删、不要覆盖。
第 3 步 · 不用重装、不用动数据库
不要重新跑 install.php,不要删 config.php(会丢管理员密码、API Token、水印 / 限流 / 防盗链等全部设置)。
不用点「修复数据表」,不用导 litepic.sql —— 这版没加表也没加字段。
第 4 步 · 跑一次自检
访问 你的域名/check.php 或进后台「环境自检」,确认「私有桶签名代理」「批量打包下载」两项是绿的。
第 5 步 · 不用私有桶的话,到这里就结束了
行为与 V2.2.0 完全一致,不用做任何额外配置。
第 6 步 · 要用私有桶
后台 →「云存储设置」→ 勾选「私有桶模式」→ 设签名有效期 → 保存(会自动刷新存量外链)→ 点「测试连接」,确认「预签名 GET 私有对象」是绿的 → 传一张图,复制外链隔天再打开验证不过期。
注意此时自定义域名不生效,若之前填了 CDN 域名,建议清空。
第 7 步 · 要用短链 / 打包下载
短链:后台「图片管理」筛选到目标图 → 「短链统计」里选中该图生成 → 复制链接访问一次 → 回列表看点击数是否 +1。
打包:勾几张图点「打包下载选中(ZIP)」,确认能正常解压、中文名不乱码。
第 8 步 · Nginx 规则确认
宝塔默认用 Nginx,.htaccess 不生效。请确认站点配置里有:
location = /config.php { deny all; }
location = /litepic.sql { deny all; }
location = /check.php { deny all; } ← 排查完建议加,或直接删掉 check.php
location ^~ /data/ { deny all; }
location /libs/ { deny all; }
data/ 新增了 shortlinks.php,这条 deny 别漏。
想要 /i/abc123 形式的短链,在 server 块内、各 location 之前加一句:
rewrite ^/i/([a-zA-Z0-9_-]+)/?$ /i.php?c=$1 last;
不加也完全能用,只是地址是 ?c= 形式。Apache 用户不用改,.htaccess 已内置。
六、全新安装步骤(没装过的看这里,纯文本逐条)
第 1 步 · 宝塔 → 网站 → 添加站点,PHP 版本选 7.4 及以上,同时创建一个 MySQL 数据库,记下 库名 / 用户名 / 密码(主机一般填 127.0.0.1 或 localhost,端口 3306)。
第 2 步 · 把 V2.3.0 压缩包解压到站点根目录(解压即根目录,不要套一层文件夹)。
第 3 步 · 浏览器访问 你的域名/install.php,填管理员账号密码、API Token(建议填)、站点地址,以及上面的数据库信息,点「开始安装」。安装程序会自动建表并写入默认用户组。
第 4 步 · 确认 uploads/ 和 data/ 目录可写(权限 755,不行再 777)。
第 5 步 · 按提示删除或重命名 install.php。
第 6 步 · 访问 你的域名/check.php 跑一次环境自检,全绿就说明环境没问题。
第 7 步 · 后台按需开启:云存储、私有桶模式、必须登录、开放注册、邮箱验证、SMTP、用户组。开启邮箱验证之前先把 SMTP 配好并成功发一封测试邮件;开云存储记得点「测试连接」。
第 8 步 · 首页传一张图,能出外链就完工。PicGo / Typora 填 你的域名/api.php,图片字段名 file,JSON 路径 data.url。
补充说明:随包带了 litepic.sql(表结构 + 默认分组),正常安装完全不用导入;只有数据库账号没有建表权限时,才需要在宝塔 / phpMyAdmin 手动导入,再回后台点「修复数据表」。
七、常见问题
问:升级会不会影响以前传的图?
答:不会。索引结构没变,config.php、data/、uploads/ 全部原样保留。只有主动开启私有桶并保存时,程序才会刷新云端图片的外链地址,本地图片一条都不动。
问:私有桶模式的外链会不会过期?
答:不会。过期的是签名,不是外链。索引里存的是 img.php 这个站内地址,每次访问现场生成新签名再跳转,你把链接存一年再打开也照样能用。
问:我开了私有桶,之前配的 CDN 域名怎么没效果了?
答:这是设计如此。SigV4 签名和请求 Host 绑定,CDN 回源一旦改写 Host 签名就失效,所以私有模式下程序直接用 Endpoint 签名地址,自定义域名会被忽略,环境自检也会标红提醒。要 CDN 请用公开桶。
问:短链能统计独立访客吗?
答:目前只记累计点击次数和最后访问时间,不去重、不记 IP,也不写 Cookie——纯图床不想引入隐私负担。要知道哪条链接带来多少流量,这个粒度够用。
问:打包下载提示「没有可下载的图片」?
答:先看是不是勾了云端图片但云存储配置已失效(签名 GET 会失败并跳过),或本地文件已被清理。后台「环境自检」和「测试连接」能定位。图片超过单张 8MB 或单包 64MB 也会被跳过。
问:没装 ZipArchive 扩展能打包吗?
答:能,这正是手写 ZIP 的原因。只需要 PHP 内置的 crc32 / pack,宝塔默认都有。
问:短链停用 / 删除后,以前发出去的链接会怎样?
答:立即返回 404,不会继续跳到图片。要临时下线用「停用」,想恢复再点一次「启用」即可。
问:check.php 不用登录就能访问,安全吗?
答:报告里不含任何密码、密钥、绝对路径,但也建议排查完就在 Nginx 里 deny 掉或直接删掉这个文件。
八、下载与说明
密码:1bam
文件名:LitePic.zip(解压即站点根目录,不要套一层文件夹)
随包文件:README.md(完整文档)、litepic.sql(正常安装无需导入)、本更新帖纯文本文案
适用:全新安装,或从 V1.x / V2.0 / V2.1 / V2.2 升级
环境:PHP 7.4+ / MySQL(用户系统)/ 宝塔面板;GD、curl、openssl、pdo_mysql 建议全开,缺了会自动降级并在自检里标出来
开发者 / 署名:云智Cloud
开源协议:MIT License,保留署名即可自由使用、修改、分发
本程序仅供合法用途,使用者须自行承担因使用本程序而产生的一切法律责任。
有问题欢迎在帖子里回,带上 check.php 里「一键复制诊断结果」那段纯文本,排查会快很多(报告不含任何敏感信息)。
下版方向(暂定 V2.4):图片详情与 EXIF 处理、上传参数前端可覆盖、私有对象临时授权给第三方、批量复制外链。优先级按回帖里的实际需求来排,有想要的功能直接说。
