简易对象存储服务 · 文件上传至项目根目录 /zfss · 返回可外网访问的 URL
Z-FSS(Zhuolu File Storage Service)是一套基于 Laravel 11 + LayUI + MySQL 的轻量文件存储系统,类似阿里云 OSS / MinIO 的精简版。
zfss/ 下,并同步到 public/zfss/ 供 HTTP 访问https://z-fss.ridacab.com/zfss/2026/10/22/xxx.pdf以下类型参考阿里云 OSS 常见对象格式。上传时以文件扩展名为主校验;MIME 类型也会辅助校验(允许 application/octet-stream)。
| 分类 | 支持的扩展名 |
|---|---|
| 图片 | jpg, jpeg, png, gif, bmp, webp, svg, ico, tif, tiff, heic, heif, psd, ai, eps |
| 文档 / 办公 | pdf, doc, docx, xls, xlsx, ppt, pptx, txt, rtf, csv, md, odt, ods, odp, pages, numbers, key |
| 压缩包 | zip, rar, 7z, tar, gz, tgz, bz2, xz |
| 音频 | mp3, wav, aac, flac, ogg, m4a, wma, amr, ape |
| 视频 | mp4, avi, mov, wmv, flv, mkv, webm, m3u8, ts, 3gp, mpg, mpeg, rm, rmvb, m4v |
| 网页 / 开发资源 | html, htm, css, js, json, xml, yaml, yml, map, wasm |
| 字体 | ttf, otf, woff, woff2, eot |
| 安装包 / 其他 | apk, ipa, dmg, iso, img, bin, dat, log, sql, conf, ini, pem, crt, cer, p12 |
合计:共支持 94 种扩展名。
即使未在白名单中,以下类型也会被拒绝(防止可执行脚本通过 Web 目录被访问):
php, phtml, php3, php4, php5, php7, php8, phar, asp, aspx, asa, asax, ascx, ashx, asmx, jsp, jspx, cgi, htaccess, htpasswd, shtml, exe, bat, cmd, com, msi, scr, vbs, ps1, sh
如需增减类型,请修改服务器上的 config/zfss.php,并执行 php artisan config:clear。
登录管理后台 → API 密钥 → 创建密钥,获得 AccessKey 与 SecretKey。
https://z-fss.ridacab.com/api/v1
方式 A:请求头(推荐)
X-Access-Key: 你的AccessKey
X-Secret-Key: 你的SecretKey
方式 B:Authorization Bearer
Authorization: Bearer {AccessKey}:{SecretKey}
方式 C:Query / 表单参数
access_key=你的AccessKey&secret_key=你的SecretKey
{
"code": 0,
"message": "success",
"data": { ... }
}
| 字段 | 说明 |
|---|---|
| code | 0 表示成功,非 0 为错误码(与 HTTP 状态码接近) |
| message | 提示信息 |
| data | 业务数据,失败时为 null |
POST https://z-fss.ridacab.com/api/v1/upload
Content-Type: multipart/form-data
| 参数 | 位置 | 必填 | 说明 |
|---|---|---|---|
| file | form-data | 是 | 文件字段名必须为 file,类型见第 2 节 |
| X-Access-Key | Header | 是 | AccessKey |
| X-Secret-Key | Header | 是 | SecretKey |
成功响应示例:
{
"code": 0,
"message": "上传成功",
"data": {
"uuid": "a1b2c3d4-....",
"url": "https://z-fss.ridacab.com/zfss/2026/10/22/20261022153000_abcdef.pdf",
"original_name": "contract.pdf",
"size": 204800,
"mime_type": "application/pdf",
"extension": "pdf",
"created_at": "2026-10-22 15:30:00"
}
}
GET https://z-fss.ridacab.com/api/v1/files?page=1&limit=20&keyword=
GET https://z-fss.ridacab.com/api/v1/files/{uuid}
DELETE https://z-fss.ridacab.com/api/v1/files/{uuid}
curl -X POST "https://z-fss.ridacab.com/api/v1/upload" \
-H "X-Access-Key: ZFDEMOACCESSKEY01" \
-H "X-Secret-Key: zfss_demo_secret_key_please_change" \
-F "file=@/path/to/document.pdf"
use Illuminate\Support\Facades\Http;
$response = Http::withHeaders([
'X-Access-Key' => '你的AccessKey',
'X-Secret-Key' => '你的SecretKey',
])->attach('file', file_get_contents('/path/to/document.pdf'), 'document.pdf')
->post('https://z-fss.ridacab.com/api/v1/upload');
$data = $response->json();
$url = $data['data']['url'] ?? null;
const form = new FormData();
form.append('file', fileInput.files[0]);
const res = await fetch('https://z-fss.ridacab.com/api/v1/upload', {
method: 'POST',
headers: {
'X-Access-Key': '你的AccessKey',
'X-Secret-Key': '你的SecretKey'
},
body: form
});
const json = await res.json();
console.log(json.data.url);
import requests
files = {'file': open('document.pdf', 'rb')}
headers = {
'X-Access-Key': '你的AccessKey',
'X-Secret-Key': '你的SecretKey',
}
r = requests.post('https://z-fss.ridacab.com/api/v1/upload', headers=headers, files=files)
print(r.json()['data']['url'])
z-fss.zhuoluyunkeji.com)指向 public/ 目录.env 中的 APP_URL=https://z-fss.zhuoluyunkeji.com 与 MySQL 连接php artisan migrate --seed 初始化数据库zfss/ 与 public/zfss/ 可写默认管理员:admin@zfss.local / admin123
更多细节见项目根目录 README.md。