单文件搭建超轻量PHP图床程序,支持PicGo/Typora一键上传 - 开源小栈 - 专注于高质量开源项目、AI论文复现与开发者工具分享

本文详细介绍如何使用单个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

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

Token、随机密码生成器

更复杂的密码

与Typora配合使用

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

PixPin_2025-12-05_18-27-36

上传测试

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

PixPin_2025-12-05_18-28-55

上传

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

上传成功

分类: 暂无分类 标签: PicGo图床单文件图床PHP图片上传PHP图床单文件图床Typora图床图床搭建

评论

暂无评论数据

暂无评论数据

目录