单文件搭建超轻量PHP图床程序,支持PicGo/Typora一键上传
本文详细介绍如何使用单个PHP文件搭建一个极致轻量的个人图床服务。该方案无需数据库,仅需一个upload.php文件,即可实现完整的图片上传、存储和管理功能。程序完美兼容PicGo客户端,支持与Typora等Markdown编辑器无缝集成,实现截图后自动上传并返回Markdown链接。文章提供了完整的PHP源代码(含详细注释)、PicGo配置教程、安全Token设置方法,并推荐搭配TinyPNG插件进行图片压缩以节省资源。本方案适合博客作者、开发者及任何需要高效管理本地图片资源的用户,具有部署简单、安全可控、完全免费等优点。
完整的PHP文件代码
upload.php全部内容如下:
<?php
/**
* ============================================================================
* PicGo 自定义 Web 图床接口
* ============================================================================
* @作者 : 开源小栈
* @日期 : 2025.12.05
* @邮箱 : hubtools@163.com
* @功能 : 接收 PicGo 上传的图片,按 /picgo/yyyy/mm/ 结构归档,并返回 JSON 链接
* @版权声明 : Copyright © 2025 开源小栈. All rights reserved.
* 未经允许请勿用于商业用途,仅供个人学习与使用。
* * ============================================================================
*/
header('Content-Type: application/json; charset=utf-8');
date_default_timezone_set("Asia/Shanghai");
// ===================== 1. 配置区域 =====================
// [A] 安全密钥:PicGo "自定义Body" 里的 {"token": "..."}
$config_token = "www.hubtools.cn_666";
// [B] 上传字段名:PicGo "POST参数名"
$config_field = "file";
// [C] 物理根目录:图片实际保存的绝对路径
$base_path = "/www/wwwroot/www.hubtools.cn/usr/uploads/picgo/";
// [D] 访问域名:浏览器访问图片的 URL 前缀
$base_url = "https://www.hubtools.cn/usr/uploads/picgo/";
// ===================== 2. 处理逻辑 =====================
// 获取 Token
$request_token = isset($_POST['token']) ? $_POST['token'] : '';
// 1. 安全验证
if ($request_token !== $config_token) {
echo json_encode(['success' => false, 'message' => 'Token Error: 密钥验证失败']);
exit;
}
// 2. 检查是否有文件上传
if (!isset($_FILES[$config_field]) || $_FILES[$config_field]['error'] > 0) {
echo json_encode(['success' => false, 'message' => 'No file uploaded']);
exit;
}
// 3. 准备目录路径 (格式:picgo/2025/12/)
$sub_dir = date('Y/m/');
$target_dir = $base_path . $sub_dir;
$target_url = $base_url . $sub_dir;
// 4. 检查并创建目录
if (!is_dir($target_dir)) {
if (!mkdir($target_dir, 0755, true)) {
echo json_encode(['success' => false, 'message' => 'Mkdir failed: 目录创建失败,请检查权限']);
exit;
}
}
// 5. 获取并验证文件后缀
$original_name = $_FILES[$config_field]['name'];
$extension = pathinfo($original_name, PATHINFO_EXTENSION);
$allowed_ext = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg', 'ico'];
if (!in_array(strtolower($extension), $allowed_ext)) {
echo json_encode(['success' => false, 'message' => 'File type not allowed']);
exit;
}
// 6. 生成新文件名 (格式:日_时分秒_随机数.后缀)
$new_filename = date('d_His') . '_' . rand(1000, 9999) . '.' . $extension;
$upload_file_path = $target_dir . $new_filename;
// 7. 移动文件并返回结果
if (move_uploaded_file($_FILES[$config_field]['tmp_name'], $upload_file_path)) {
echo json_encode([
'success' => true,
'message' => 'Upload success',
'url' => $target_url . $new_filename
]);
} else {
echo json_encode(['success' => false, 'message' => 'Move file failed']);
}
?>把这个脚本放到网站的任意问题,可以是/usr/uploads,并且新建了一个picgo目录。

PicGo的配置
首先需要下载一个web-uploader插件,这个也是picgo上传的配置插件。

然后在自定义Web图床里设置:
- 图床配置名:随便,可以是网站的名字
- API地址:也就是填PHP的地址,可以是网站根目录,你PHP放在哪就写哪
- POST参数名:填 file
- JSON路径:填url
- 自定义Body:
{"token":"123456"}(记得改成你自己设的密码)

这里我推荐和一些压缩插件进行配合使用,一方面是节省CDN的资源,一方面是节约硬盘的占用。常用的是使用Tinypng。

Tinypng每个月的前500张都是免费的,其实对于大多数个人用户是够了的(不够的话你再用其他邮箱注册一个号)。

推荐生成随机复杂token
网上有很多随机密码生成的在线工具,随便选一个就行,主要是为了接口的安全。

与Typora配合使用
Picgo与Typora配合使用我就不多说了,网上随便一搜就一堆。实在不了解可以问问AI。

上传测试
就以本文写的图片进行测试:


上传成功之后会在桌面右下角通知:

版权申明
本文章是52txr原创文章,未经许可,禁止转载,禁止任何AI爬虫使用本网站内容。开源小栈是陶小桃Blog纯技术/知识的分身网站,欢迎每一位访客朋友。
暂无评论数据