【硬核】Python + Hugging Face,手撸无限容量私有图床
摘要:受够了第三方图床的限制和收费?担心数据安全?本文带你用 Python Flask 和 Hugging Face Spaces,零成本搭建一个支持无限存储、加密登录、iOS 磨砂级 UI的私有图床。
01 写在前面
作为一名技术爱好者,在写博客、做笔记(Obsidian/Notion)时,图床是刚需。
市面上的图床要么收费,要么有容量限制,要么担心哪天这就跑路了。
- • 放在 GitHub 仓库里?国内访问速度感人。
- • 放在 阿里云 OSS?如果不小心被刷流量,房子都要赔进去。
服务器搭建才是最优解,但没有服务器怎么办呢?
于是我萌生了一个想法:
为什么不利用 Hugging Face (HF) 提供的免费 Dataset 存储,自己写一个图床呢?
说干就干。经过一整天的折腾,N个版本的迭代,CloudGallery 诞生了。
它不仅免费、无限容量,最重要的是,作为一个“颜控”,我把它的 UI 打磨到了极致。
02 颜值即正义:UI 设计展示
在这个看脸的时代,工具不仅要好用,更要好看。我抛弃了传统的“工程师审美”,深度参考了 iOS 的设计语言。

🖼️ 登入框采用毛玻璃特效,清爽无广告
✨ 主界面:极简纯净
没有复杂的菜单,只有一张干净的磨砂玻璃背景。支持多选图片批量上传,文件名自动缩短(如 a9b2.jpg),强迫症福音。

✨ 悬浮预览:沉浸式体验
点击图片,不再是生硬的跳转,而是弹出一个悬浮的 Lightbox。背景采用高斯模糊(Blur)+ 半透明白处理,图片悬浮于主页之上,仿佛置身于艺术画廊。

03 硬核功能:不只是好看
除了好看,它的内核也非常能打。
1. 无限容量 & 永久存储 ♾️
后端直接对接 Hugging Face Datasets。众所周知,HF 的 Dataset 存储空间理论上是无限的,且由大厂背书,不用担心数据丢失。
2. 私有化部署 & 安全登录 🔒
图床部署在私有的 Space 中,自带账号密码登录系统。只有你知道密码,只有你能上传和删除图片。
3. 独家技术:GitHub 直链代理 (Proxy Mode) 🚀
这是开发过程中遇到的最大坑。
如果将 HF Dataset 设为 Private(私有),生成的图片链接 GitHub 是无法访问的(会报 401 错误)。如果设为 Public,又担心隐私泄露。
解决方案:我在 Flask 后端写了一个反向代理接口。
- • 当你复制链接时,得到的是
https://我的域名/file/xxxx.jpg。 - • 当 GitHub 请求这个链接时,我的服务器会拿着私有 Token 去 HF 取回图片数据,再转发给 GitHub。
结果: 既保证了仓库的私有性,又能在任何地方(GitHub/博客/微信)完美展示图片!
4. 生产力拉满 ⚡
- • ✅ 拖拽/多选上传:一次传多张图,响应速度不错。
- • ✅ 一键复制:支持复制直链和 Markdown 格式。
- • ✅ 自由缩放:预览页支持滚轮无限缩放,查看像素级细节。
04 核心代码解析
项目后端使用 Python Flask,部署在 Docker 容器中。
核心代理逻辑:为了解决 GitHub 无法查看私有图片的问题,这个接口至关重要:
# main.py 核心片段@app.route('/file/<path:filename>')defget_image_file(filename):# 构造真实的 HF 地址 url = f"https://huggingface.co/datasets/{DATASET_NAME}/resolve/main/{filename}"# 带着你的 Token 去请求,这就相当于有了“钥匙” headers = {"Authorization": f"Bearer {HF_TOKEN}"}# 流式转发数据,不占用服务器内存 r = requests.get(url, headers=headers, stream=True)return Response(r.iter_content(chunk_size=1024), content_type=r.headers.get('Content-Type'))
极简短文件名生成:为了不让 URL 看起来像乱码,我使用了 UUID 的前 4 位:
# 自动截取前4位,生成结果类似:c8a1.jpgname = f"{uuid.uuid4().hex[:4]}{ext}"
05 如何拥有同款图床?
我已经将代码整理,只需要按顺序完成以下 4 步 即可拥有:
第一步:注册账号,创建存储仓库 (Dataset)
后端需要一个地方存图片,我们需要创建一个 Dataset。
- 1. 登录 Hugging Face,点击右上角头像 -> New Dataset。
- 2. Dataset name: 起个名字(例如
my-images)。 - 3. Dataset type: 强烈建议选择 Private(私有),保护你的隐私。
- 4. 点击 Create dataset。(记下这个名字,格式为
你的用户名/my-images,稍后要用)
第二步:获取访问钥匙 (Token)
为了让程序能读写上面的仓库,需要一把钥匙。
- 1. 点击头像 -> Settings -> Access Tokens。
- 3. Token type (权限) 必须选择 Write (写入权限)。
- 4. 复制生成的 Token (
hf_xxxx...)。
第三步:创建应用容器 (Space)
- 1. 点击顶部导航栏的 Spaces -> Create new Space。
- 2. Space name: 随便起(例如
cloud-gallery)。 - 4. Space hardware: 保持默认 (Free) 即可。
第四步:配置与上传
- 1. 在 Space 页面,进入 Settings -> Variables and secrets,添加以下环境变量:
- •
HF_TOKEN: 刚才复制的 Write 权限 Token。 - •
DATASET_NAME: 第一步创建的 Dataset 名称 (如 username/my-images)。
- 2. 回到 Files 标签页,点击 Add file -> Upload files,将
main.py 和 Dockerfile 上传并提交。
等待几分钟构建完成,点击上方的 App 即可访问!
⚡ 进阶玩法:国内无障碍访问 (Cloudflare Worker)
由于 Hugging Face 的官方域名 (hf.space) 在国内网络环境下访问不稳定或被阻断,如果你希望在国内流畅使用(例如微信、博客直接加载图片),推荐使用 Cloudflare Worker 进行反向代理。
前提: 请确保你在上传代码时,使用的是支持 CUSTOM_DOMAIN 变量的增强版 main.py(即 GitHub 仓库中的 cf.py 版本)。
1. 创建 Cloudflare Worker
- 1. 登录 Cloudflare,进入左侧 Workers & Pages。
- 2. 点击 Create Application -> Create Worker -> Deploy。
- 3. 点击 Edit code,清空默认代码,粘贴以下内容:
exportdefault {asyncfetch(request, env, ctx) {const url = newURL(request.url);// ⚠️ 修改这里:填入你 Space 的真实直连地址 (不要带 https://)const targetHost = "你的用户名-项目名.hf.space"; url.hostname = targetHost; url.protocol = "https:";// 构造请求const newRequest = newRequest(url.toString(), {method: request.method,headers: request.headers,body: request.body, });returnfetch(newRequest); },};
- 5. (强烈推荐) 在 Worker 的 Settings -> Triggers 中绑定你自己的自定义域名(如
img.yourdomain.com),因为 workers.dev 域名在国内也偶有不稳定。
2. 配置环境变量
回到 Hugging Face Space 的 Settings -> Variables and secrets,新增一个变量:
| | |
CUSTOM_DOMAIN | | https://img.yourdomain.com |
⚠️ 注意: 域名必须带 https://,且结尾不要带 /。
3. 效果
配置完成后,Space 会自动重启。之后:
- • 复制链接:主页生成的“复制链接”会自动替换为你的加速域名(如
https://img.yourdomain.com/file/abc.jpg),确保在国内任何网络环境下都能秒开!
GitHub 项目地址:
🔗 [https://github.com/CC342/CloudGallery]
(欢迎 Star,欢迎 Fork!)
06 结语
在这个云服务越来越贵的年代,利用开源社区的力量,通过一点点 Python 代码,就能搭建出既美观又实用的生产力工具,这或许就是编程的乐趣所在。
如果你觉得这个项目对你有帮助,请点个 “在看” 或分享给更多的朋友!