
mayth/simple-upload-servergo-simple-upload-server 是一个用Golang编写的轻量级HTTP服务器,主要用途是存储文件制品。它提供简单的文件上传、下载功能,并支持基于token的认证机制,适用于个人文件存储、小型团队共享或CI/CD制品暂存等场景。
POST /upload上传文件(自动命名)、PUT /files/:path指定路径上传,以及GET /files/:path下载文件| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
-addr | string | 127.0.0.1:8080 | 服务器监听地址 |
-config | string | - | 配置文件路径(命令行参数优先级高于配置文件) |
-document_root | string | . | 文档根目录(文件存储路径) |
-enable_auth | bool | false | 是否启用认证机制 |
-enable_cors | bool | true | 是否启用CORS头 |
-file_naming_strategy | string | uuid | 文件命名策略(默认使用UUID) |
-max_upload_size | int | *** (1MB) | 最大上传大小(字节) |
-read_only_tokens | value | - | 逗号分隔的只读令牌列表 |
-read_write_tokens | value | - | 逗号分隔的读写令牌列表 |
-shutdown_timeout | int | *** (15s) | 优雅关闭超时时间(毫秒) |
bashdocker run -p 8080:8080 -v ./data:/data go-simple-upload-server -addr 0.0.0.0:8080 -document_root /data
bashdocker run -p 8080:8080 -v ./data:/data go-simple-upload-server \ -addr 0.0.0.0:8080 \ -document_root /data \ -enable_auth \ -read_write_tokens "rw_token1,rw_token2" \ -read_only_tokens "ro_token1"
默认无需认证,启用认证需设置-enable_auth=true,并配置令牌:
read_only_tokens):允许执行GET(下载)、HEAD(检查文件存在)操作read_write_tokens):允许所有只读操作及POST(上传)、PUT(指定路径上传)操作认证方式:
Authorization: Bearer <TOKEN>请求头传递token=<TOKEN>查询参数传递(请求头优先级更高)认证失败响应:401 Unauthorized,响应体为{"ok": false, "error": "unauthorized"}
v2版本移除了内置TLS支持,建议通过反向代理(如Nginx)实现HTTPS。
POST /upload上传文件,服务器自动生成文件名(基于命名策略)
multipart/form-data| 名称 | 是否必填 | 类型 | 描述 | 默认值 |
|---|---|---|---|---|
file | 是 | Form Data | 文件内容 | - |
overwrite | 否 | boolean | 是否允许覆盖已有文件 | false |
201 Created,Content-Type: application/json
json{"ok": true, "path": "/files/<filename>"}
409 Conflict(文件已存在且未允许覆盖)bashcurl -F "file=@localfile.txt" http://localhost:8080/upload
PUT /files/:path上传文件并指定存储路径(忽略原始文件名)
| 名称 | 是否必填 | 类型 | 描述 | 默认值 |
|---|---|---|---|---|
:path | 是 | URL路径 | 服务器存储路径(如/docs/report.pdf) | - |
file | 是 | Form Data | 文件内容 | - |
overwrite | 否 | boolean | 是否允许覆盖已有文件 | false |
201 Created,Content-Type: application/json
json{"ok": true, "path": "/files/<path>"}
409 Conflict(文件已存在且未允许覆盖)bashcurl -X PUT -F "file=@localfile.txt" http://localhost:8080/files/docs/report.pdf
GET /files/:path下载指定路径的文件
| 名称 | 是否必填 | 类型 | 描述 |
|---|---|---|---|
path | 是 | URL路径 | 文件存储路径 |
200 OK,响应体为文件内容(Content-Type自动推断)404 Not Found(文件不存在)bashcurl http://localhost:8080/files/docs/report.pdf -o downloaded.pdf
HEAD /files/:path检查文件是否存在(仅返回响应头,无响应体)
path(URL路径,文件存储路径)200 OK(文件存在)404 Not Found(文件不存在)bashcurl -I http://localhost:8080/files/docs/report.pdf
OPTIONS /files/:path 和 OPTIONS /uploadCORS预检请求(无需认证,始终返回204 No Content)
OPTIONS * HTTP/1.1 格式请求OPTIONS /files/:path 仍返回 204 No Contentbash# 运行所有测试(含端到端测试) go test ./... # 使用真实文件系统测试(需确保文档根目录为空) TEST_WITH_REAL_FS="./testdata" go test ./... # 测试远程服务器(需提前清空目标服务器文档根目录) TEST_TARGET_ADDR="localhost:8080" go test ./...
bash# 运行端到端测试 docker compose -f docker-compose.e2e.yml run --rm test # 测试完成后清理 docker compose -f docker-compose.e2e.yml down --rmi local --volumes

manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务