开源文件服务器ghs

GHS Pro是一个功能完整的 Go 语言静态文件服务器,使用 React+TypeScript 前端,支持文件上传下载、目录压缩、搜索、断点续传、访问控制和 HTTPS/WebDAV 支持。
功能特性
- ✅ 文件上传/下载: 支持多文件上传和拖拽上传
- ✅ 目录压缩: 将目录打包为 ZIP 文件下载
- ✅ 文件搜索: 基于文件名的模糊搜索,实时搜索
- ✅ 断点续传: 支持 HTTP Range 请求,实现断点续传和并发下载
- ✅ 路径访问控制: 支持路径级别的允许/拒绝规则(支持通配符)
- ✅ HTTPS 支持: 支持 TLS/SSL 加密传输
- ✅ WebDAV 支持: 完整的 WebDAV 协议实现
- ✅ curl 友好: RESTful API 设计,方便命令行工具调用
- ✅ 现代化前端: React + TypeScript,响应式设计,拖拽上传
- ✅ 文件管理: 前端可查看、上传、下载、搜索和删除文件
- ✅ 文件分享: 一键生成分享链接并复制到剪贴板,支持文件和文件夹分享
安装
一键安装[强烈推荐]
docker rm -f gohttpserver
docker run -itd --restart=always -v /opt/gohttpserver:/data -p 8080:8080 -e AUTH=admin:password123 -e BASE_URL=http://[Your IP]:8080 --name gohttpserver harbor.michaelapp.com/gohttpserver/gohttpserver:v1.26 --upload --delete
使用方法
基本用法
# 启动服务器(默认端口 8080,当前目录)
./gohttpserver
# 指定根目录和端口
./gohttpserver --root /path/to/files --port 9000
# 启用前端(需要先构建前端)
./gohttpserver --root ./data --port 8080 --web-dir ./frontend/dist
# 启用 HTTPS
./gohttpserver --https --cert cert.pem --key key.pem
# 启用 HTTP Basic 认证
./gohttpserver --auth "username:password"
# 启用文件上传功能(默认关闭)
./gohttpserver --upload
# 启用文件删除功能(默认关闭)
./gohttpserver --delete
# 同时启用上传和删除功能
./gohttpserver --upload --delete
# 启用 WebDAV(默认启用)
./gohttpserver --webdav
# 配置分享链接的基础地址(用于内网或域名访问)
./gohttpserver --base-url http://10.0.203.100:8080
# 使用环境变量配置基础地址
BASE_URL=http://10.0.203.100:8080 ./gohttpserver
命令行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
--root |
服务根目录 | . (当前目录) |
--port |
HTTP 端口 | 8080 |
--https-port |
HTTPS 端口 | |
--https |
启用 HTTPS | false |
--cert |
TLS 证书文件路径 | |
--key |
TLS 私钥文件路径 | |
--auth |
HTTP Basic 认证 | |
--allow-paths |
允许访问的路径列表 | |
--deny-paths |
拒绝访问的路径列表 | |
--webdav |
启用 WebDAV 支持 | true |
--upload |
启用文件上传功能 | false |
--delete |
启用文件删除功能 | false |
--web-dir |
前端文件目录 | |
--base-url |
分享链接的基础地址,可通过 BASE_URL 环境变量设置。 |
访问控制示例
# 只允许访问 /public 和 /shared 目录
./gohttpserver --allow-paths "/public,/shared"
# 拒绝访问 /private 目录
./gohttpserver --deny-paths "/private"
# 组合使用:允许 /public,拒绝 /public/secret
./gohttpserver --allow-paths "/public" --deny-paths "/public/secret"
注意: 访问控制优先级:deny > allow > 默认策略(允许)
API 接口
文件列表
# 获取文件列表
curl http://localhost:8080/api/list?path=/
# 带认证
curl -u username:password http://localhost:8080/api/list?path=/subdir
文件下载
# 下载文件
curl -O http://localhost:8080/api/download/path/to/file.txt
# 断点续传(支持 Range 请求)
curl -C - -O http://localhost:8080/api/download/large-file.zip
目录压缩下载
# 下载目录为 ZIP
curl -O http://localhost:8080/api/zip/path/to/directory
文件上传
注意: 需要启动时使用 --upload 标志启用上传功能。
# 单文件上传
curl -X POST -F "file=@/path/to/file.txt" -F "path=/" http://localhost:8080/api/upload
# 多文件上传
curl -X POST -F "files=@file1.txt" -F "files=@file2.txt" -F "path=/uploads" http://localhost:8080/api/upload
文件搜索
# 搜索文件
curl "http://localhost:8080/api/search?q=keyword"
# 限制搜索结果数量
curl "http://localhost:8080/api/search?q=keyword&max=50"
删除文件/目录
注意: 需要启动时使用 --delete 标志启用删除功能。
# 删除文件
curl -X DELETE http://localhost:8080/api/delete/path/to/file.txt
Web 界面
访问 http://localhost:8080/ 即可使用 Web 界面:
- 📁 浏览文件和目录(表格视图)
- 🔍 实时搜索文件
- 📤 拖拽上传文件
- ⬇️ 下载文件和目录(ZIP)
- 🔗 分享文件和文件夹(一键复制分享链接)
- 🗑️ 删除文件/目录
- 🧭 面包屑导航
分享功能
Web 界面支持文件和文件夹的分享功能:
- 文件分享: 点击文件列表中的”分享”按钮,系统会自动生成文件的直接下载链接并复制到剪贴板
- 文件夹分享: 点击文件夹的”分享”按钮,系统会生成带路径参数的页面链接,打开后自动跳转到对应目录
- 视觉反馈: 复制成功后,分享按钮图标会短暂变为 ✓,提示用户已成功复制
- 使用场景: 可以将分享链接发送给他人,方便协作和文件分发