切换主题
💾 本地文件存储
本地文件存储将文件保存在服务器本地磁盘,适合小规模部署或开发测试环境。
配置示例
yaml
files:
- business-type: demo
file-type: local
business-folder: demo-files
root-path: /srv/file/data
http-access-path: https://files.example.com
max-size: 100MB
chunk-size: 10MB
allowed-upload-suffix: jpg,png,pdf,doc,docx
allow-delete: true1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
yaml
files:
- business-type: demo
file-type: local
business-folder: demo-files
root-path: /srv/file/data
http-access-path: http://api.example.com/download/demo
max-size: 100MB
chunk-size: 10MB
allowed-upload-suffix: jpg,png,pdf,doc,docx
allow-delete: true1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
参数说明
| 参数 | 必填 | 说明 | 示例 |
|---|---|---|---|
business-type | 是 | 业务类型标识 | demo |
file-type | 是 | 固定值:local | local |
business-folder | 否 | 业务文件夹前缀 | demo-files |
root-path | 是 | 文件存储根目录 | /srv/file/data |
http-access-path | 是 | 文件访问地址 | https://files.example.com |
max-size | 否 | 单文件大小限制 | 100MB |
chunk-size | 否 | 分片上传大小(默认5MB) | 10MB |
allowed-upload-suffix | 否 | 允许的文件后缀 | jpg,png,pdf |
allow-no-suffix | 否 | 是否允许无后缀文件 | false |
allow-delete | 否 | 是否允许删除 | true |
快速开始
1. 创建存储目录
bash
# 创建根目录
mkdir -p /srv/file/data
# 设置目录权限
chmod 755 /srv/file/data
chown -R file-server:file-server /srv/file/data1
2
3
4
5
6
2
3
4
5
6
分片上传临时目录
本地存储模式下,分片上传会使用临时目录:
- 临时目录路径:
{root-path}/temp/chunks/{YYYY}/{MM}/{DD}/{fileId}/ - 按日期分层存储,避免单目录文件过多
- 分片文件命名:
chunk_0,chunk_1,chunk_2... - 合并完成后自动清理临时目录
- 无需手动创建,服务会自动管理
2. 配置文件下载
方式一:Nginx静态文件服务
适合公开文件下载,性能最佳。
nginx
server {
listen 80;
server_name files.example.com;
# 开启gzip压缩
gzip on;
gzip_types text/plain application/xml application/json application/pdf;
# 配置跨域
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, OPTIONS';
location / {
root /srv/file/data;
autoindex off;
# 缓存配置
add_header Cache-Control "public, max-age=31536000";
# 防盗链配置
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
# 大文件优化
client_max_body_size 1024m;
client_body_buffer_size 1024k;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
配置文件:
yaml
http-access-path: https://files.example.com1
方式二:接口下载
适合需要权限控制的场景。
配置文件:
yaml
http-access-path: http://api.example.com/download/demo1
访问示例:
http
GET http://api.example.com/download/demo/2024/03/20/example.pdf1
安全建议
- 避免将存储目录放在Web根目录下
- 定期清理临时文件
- 配置目录访问权限
- 开启防盗链功能
- 使用HTTPS传输
最佳实践
目录结构说明
服务自动按日期分层存储:
/srv/file/data/
├── temp/ # 临时目录(分片上传使用)
│ └── chunks/
│ ├── 2024/ # 按年份分层
│ │ ├── 01/ # 按月份分层
│ │ │ ├── 15/ # 按日期分层
│ │ │ │ ├── {fileId1}/ # 文件1的分片临时目录
│ │ │ │ │ ├── chunk_0
│ │ │ │ │ ├── chunk_1
│ │ │ │ │ └── chunk_2
│ │ │ │ └── {fileId2}/ # 文件2的分片临时目录
│ │ │ │ └── chunk_0
│ │ │ └── 16/
│ │ └── 02/
│ └── 2025/
├── 2024/ # 正式文件存储(按日期分层)
│ ├── 01/
│ │ ├── 15/
│ │ │ ├── file1.jpg
│ │ │ └── file2.pdf
│ │ └── 16/
│ └── 02/
└── 2025/1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
目录说明:
temp/chunks/YYYY/MM/DD/:分片上传临时目录,按日期分层,合并完成后自动清理YYYY/MM/DD/:正式文件按日期分层存储
设计优势:
- 避免单个目录下文件过多,提升文件系统性能
- 便于按日期清理过期的临时文件
- 目录结构清晰,易于维护和监控
建议:
- 控制单目录文件数量(建议<10000)
- 定期归档历史文件
- 监控磁盘使用率
- 定期清理异常的临时文件(如上传中断)
性能优化
yaml
# 根据文件类型调整分片大小
files:
- business-type: video
chunk-size: 10MB # 视频文件
root-path: /data/video
- business-type: document
chunk-size: 5MB # 文档文件
root-path: /data/docs1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
优化建议:
- 使用SSD存储提升性能
- 配置CDN加速
- 启用Nginx缓存
- 开启GZIP压缩
- 定期清理过期文件
备份策略
bash
# 定时备份脚本
#!/bin/bash
BACKUP_DIR="/backup/files"
SOURCE_DIR="/srv/file/data"
DATE=$(date +%Y%m%d)
# 增量备份
rsync -av --delete $SOURCE_DIR $BACKUP_DIR/$DATE/
# 保留最近7天的备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
常见问题
Q: 上传失败,提示权限错误?
A: 检查以下几点:
- 目录权限是否正确(755)
- 目录所有者是否为运行用户
- 磁盘空间是否充足
- SELinux是否影响(如启用)
Q: 如何提高访问速度?
A:
- 使用SSD存储
- 配置Nginx静态文件服务
- 开启CDN加速
- 启用浏览器缓存
- 开启GZIP压缩
Q: 如何实现文件权限控制?
A:
- 使用接口下载方式
- 在下载接口中验证用户权限
- 不要使用Nginx直接暴露文件目录
- 可以使用临时签名URL
Q: 磁盘空间不足怎么办?
A:
- 定期清理过期文件
- 配置生命周期规则
- 迁移历史文件到归档存储
- 扩展磁盘容量
- 考虑迁移到云存储
Q: 分片上传中断后,临时文件会自动清理吗?
A:
- 正常完成的上传会自动清理临时文件
- 中断的上传临时文件会保留在
temp/chunks/YYYY/MM/DD/目录 - Redis中的元数据有24小时过期时间
- 建议定期清理超过24小时的临时目录:
bash
# 清理超过24小时的临时分片目录(按日期分层)
find /srv/file/data/temp/chunks -type d -mindepth 4 -mtime +1 -exec rm -rf {} \;
# 清理空的日期目录
find /srv/file/data/temp/chunks -type d -empty -delete1
2
3
4
2
3
4
Q: 临时目录占用空间过大怎么办?
A:
- 检查是否有大量上传中断的文件
- 清理超过24小时的临时目录
- 监控临时目录大小:
bash
du -sh /srv/file/data/temp/chunks1
- 设置定时任务自动清理
监控建议
bash
# 监控磁盘使用率
df -h /srv/file/data
# 统计文件数量
find /srv/file/data -type f | wc -l
# 查看目录大小
du -sh /srv/file/data/*
# 查找大文件
find /srv/file/data -type f -size +100M
# 监控临时目录大小
du -sh /srv/file/data/temp/chunks
# 统计临时分片数量
find /srv/file/data/temp/chunks -type f | wc -l1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
定时清理脚本
bash
#!/bin/bash
# 清理超过24小时的临时分片目录
TEMP_DIR="/srv/file/data/temp/chunks"
LOG_FILE="/var/log/file-cleanup.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始清理临时文件..." >> $LOG_FILE
# 查找并删除超过24小时的文件目录(按日期分层)
find $TEMP_DIR -type d -mindepth 4 -mtime +1 | while read dir; do
echo "删除: $dir" >> $LOG_FILE
rm -rf "$dir"
done
# 清理空的日期目录
find $TEMP_DIR -type d -empty -delete
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理完成" >> $LOG_FILE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
添加到crontab定时执行:
bash
# 每天凌晨2点执行清理
0 2 * * * /path/to/cleanup-temp.sh1
2
2
注意事项
- 建议使用SSD存储以提升性能
- 定期备份重要文件
- 监控磁盘使用率
- 配置日志轮转策略
- 生产环境建议使用云存储