核心功能: - ✅ Categories/Series双视图管理(category_view.rs + import_markdown.rs) - ✅ FUSE Multi-Volume支持(tree_type参数) - ✅ SSH/SFTP/SCP/rsync协议完整实现(4042行) - ✅ NFS/SMB Module Phase 1-3完成 - ✅ Archive Module Phase 1-4完成(2916行) - ✅ Download Center API完整实现 - ✅ S3兼容API实现(560行) Git配置修正: - ✅ 删除错误origin(gitea.momentry.ddns.net) - ✅ 删除m5max128(指向机器名) - ✅ 设置origin = m5max128gitea.momentry.ddns.net/admin/markbase - ✅ 设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase 数据清理: - ✅ 删除38个临时SQLite(保留accusys.sqlite、demo.sqlite) - ✅ 删除.bak、test_*.bin、调试脚本等临时文件 - ✅ 删除临时目录(build/、download files/、raid_test/等) - ✅ 更新.gitignore排除临时文件 架构优化: - 52个文件修改,2434行新增,4739行删除 - Workspace成员整合(16个crate) - 数据库状态:accusys.sqlite保留(主demo测试) 远程同步: - ✅ 准备推送到m5max128gitea(远程Gitea) - ✅ 准备推送到m4minigitea(本地Gitea)
330 lines
7.6 KiB
Markdown
330 lines
7.6 KiB
Markdown
# 空目录上传完整指南
|
||
|
||
## 问题说明
|
||
|
||
**webkitdirectory限制:**
|
||
- HTML5标准:浏览器只选择**文件**
|
||
- 空目录不包含在`fileInput.files`中
|
||
- 无法上传完全空的目录
|
||
|
||
## 解决方案:.keep标记文件
|
||
|
||
**原理:**
|
||
- 在每个空目录中添加`.keep`文件(0字节)
|
||
- webkitdirectory会上传包含`.keep`的目录
|
||
- 目录结构完整保留
|
||
|
||
---
|
||
|
||
## 完整工作流程
|
||
|
||
### 步骤1:准备源目录
|
||
|
||
```bash
|
||
# 查看源目录结构
|
||
tree /path/to/source
|
||
|
||
# 示例结构:
|
||
/path/to/AccuSys Downloads/
|
||
├── ExaSAN-DAS/
|
||
│ ├── Model001/
|
||
│ │ └── readme.pdf # 有文件
|
||
│ ├── EmptyFolder1/ # 空目录
|
||
│ └── EmptyFolder2/ # 空目录
|
||
├── Gamma/
|
||
│ └── EmptySubFolder/ # 空目录
|
||
└── T-Share/
|
||
└── manual.pdf # 有文件
|
||
```
|
||
|
||
---
|
||
|
||
### 步骤2:运行prepare_upload.sh脚本
|
||
|
||
```bash
|
||
# 一键添加.keep文件
|
||
bash scripts/prepare_upload.sh "/path/to/AccuSys Downloads"
|
||
|
||
# 输出示例:
|
||
=== Preparing upload for /path/to/AccuSys Downloads ===
|
||
|
||
Added .keep in: /path/to/AccuSys Downloads/ExaSAN-DAS/EmptyFolder1
|
||
Added .keep in: /path/to/AccuSys Downloads/ExaSAN-DAS/EmptyFolder2
|
||
Added .keep in: /path/to/AccuSys Downloads/Gamma/EmptySubFolder
|
||
|
||
=== Preparation complete ===
|
||
Empty directories: 0
|
||
Total .keep files: 3
|
||
|
||
Ready for webkitdirectory upload
|
||
All empty directories will be uploaded with .keep files
|
||
```
|
||
|
||
---
|
||
|
||
### 步骤3:验证准备结果
|
||
|
||
```bash
|
||
# 查看所有.keep文件
|
||
find "/path/to/AccuSys Downloads" -name ".keep"
|
||
|
||
# 查看完整目录结构
|
||
tree "/path/to/AccuSys Downloads"
|
||
```
|
||
|
||
**预期结果:**
|
||
```
|
||
AccuSys Downloads/
|
||
├── ExaSAN-DAS/
|
||
│ ├── Model001/
|
||
│ │ └── readme.pdf
|
||
│ ├── EmptyFolder1/
|
||
│ │ └── .keep ✅ 添加成功
|
||
│ ├── EmptyFolder2/
|
||
│ │ └ keep ✅ 添加成功
|
||
├── Gamma/
|
||
│ ├── EmptySubFolder/
|
||
│ │ └ keep ✅ 添加成功
|
||
└── T-Share/
|
||
└ manual.pdf
|
||
```
|
||
|
||
---
|
||
|
||
### 步骤4:上传文件夹
|
||
|
||
```bash
|
||
# 打开Web界面
|
||
https://download.accusys.ddns.net/upload
|
||
|
||
# 选择文件夹
|
||
1. 点击"Select Folder"
|
||
2. 选择整个"AccuSys Downloads"文件夹
|
||
3. 自动上传所有文件(包括.keep)
|
||
|
||
# 上传结果:
|
||
- ✅ 所有文件上传成功
|
||
- ✅ 所有空目录保留(包含.keep)
|
||
- ✅ 目录结构完整
|
||
```
|
||
|
||
---
|
||
|
||
### 步骤5:验证上传结果
|
||
|
||
```bash
|
||
# 查看上传文件列表
|
||
curl -s https://download.accusys.ddns.net/api/v2/files/accusys | jq '.total_files'
|
||
|
||
# 查看目录结构(在服务器端)
|
||
find /Users/accusys/Downloads/accusys -type d
|
||
|
||
# 验证.keep文件
|
||
curl -s https://download.accusys.ddns.net/api/v2/files/accusys | jq '.files[] | select(.filename == ".keep")'
|
||
```
|
||
|
||
---
|
||
|
||
## .keep文件说明
|
||
|
||
**文件特性:**
|
||
- 文件名:`.keep`(或`.gitkeep`)
|
||
- 文件大小:0字节(空文件)
|
||
- 文件作用:标记空目录存在
|
||
- SHA256:`e3b0c44298fc1c149afbf4c8996fb924...`(标准空文件hash)
|
||
|
||
**保留策略:**
|
||
- ✅ 上传后保留`.keep`文件
|
||
- ✅ 不影响其他文件
|
||
- ✅ 不占用额外空间
|
||
- ✅ 符合Git标准惯例
|
||
|
||
---
|
||
|
||
## 脚本源码(prepare_upload.sh)
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# prepare_upload.sh - Prepare directory for upload
|
||
# Add .keep files in all empty directories
|
||
|
||
SOURCE_DIR="$1"
|
||
|
||
if [ -z "$SOURCE_DIR" ]; then
|
||
echo "Usage: bash scripts/prepare_upload.sh <source_directory>"
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -d "$SOURCE_DIR" ]; then
|
||
echo "Error: Directory not found: $SOURCE_DIR"
|
||
exit 1
|
||
fi
|
||
|
||
echo "=== Preparing upload for $SOURCE_DIR ==="
|
||
echo ""
|
||
|
||
# Find empty directories and add .keep
|
||
empty_count=0
|
||
find "$SOURCE_DIR" -type d -empty | while read dir; do
|
||
touch "$dir/.keep"
|
||
empty_count=$((empty_count + 1))
|
||
echo "Added .keep in: $dir"
|
||
done
|
||
|
||
echo ""
|
||
echo "=== Preparation complete ==="
|
||
echo "Empty directories: $(find "$SOURCE_DIR" -type d -empty | wc -l)"
|
||
echo "Total .keep files: $(find "$SOURCE_DIR" -name ".keep" | wc -l)"
|
||
echo ""
|
||
echo "Ready for webkitdirectory upload"
|
||
echo "All empty directories will be uploaded with .keep files"
|
||
```
|
||
|
||
---
|
||
|
||
## 高级用法
|
||
|
||
### 批量处理多个目录
|
||
|
||
```bash
|
||
# 处理290个文件所在的目录
|
||
bash scripts/prepare_upload.sh "/path/to/AccuSys Downloads"
|
||
|
||
# 处理嵌套空目录(多层)
|
||
bash scripts/prepare_upload.sh "/path/to/complex/structure"
|
||
|
||
# 查看处理结果
|
||
find "/path/to/AccuSys Downloads" -name ".keep" | wc -l
|
||
```
|
||
|
||
---
|
||
|
||
### 上传后清理.keep(可选)
|
||
|
||
```bash
|
||
# 如果需要删除.keep文件(保留空目录)
|
||
find /Users/accusys/Downloads/accusys -name ".keep" -delete
|
||
|
||
# 注意:删除后目录仍存在,但为空目录
|
||
```
|
||
|
||
---
|
||
|
||
## 测试案例
|
||
|
||
**测试目录:** `/tmp/test_upload`
|
||
|
||
**原始结构:**
|
||
```
|
||
/tmp/test_upload/
|
||
├── ExaSAN-DAS/
|
||
│ ├── Model001/readme.txt # 有文件
|
||
│ ├── Model002/EmptyFolder/ # 空目录
|
||
│ └ EmptySubFolder/ # 空目录
|
||
├── Gamma/manual.pdf # 有文件
|
||
└ T-Share/
|
||
├── EmptyFolder1/ # 空目录
|
||
└ EmptyFolder2/ # 空目录
|
||
```
|
||
|
||
**运行脚本:**
|
||
```bash
|
||
bash scripts/prepare_upload.sh /tmp/test_upload
|
||
```
|
||
|
||
**处理结果:**
|
||
```
|
||
Added .keep in: /tmp/test_upload/T-Share/EmptyFolder2
|
||
Added .keep in: /tmp/test_upload/T-Share/EmptyFolder1
|
||
Added .keep in: /tmp/test_upload/ExaSAN-DAS/Model002/EmptyFolder
|
||
Added .keep in: /tmp/test_upload/ExaSAN-DAS/EmptySubFolder
|
||
|
||
Empty directories: 0
|
||
Total .keep files: 4
|
||
```
|
||
|
||
**最终结构:**
|
||
```
|
||
/tmp/test_upload/
|
||
├── ExaSAN-DAS/
|
||
│ ├── Model001/readme.txt
|
||
│ ├── Model002/EmptyFolder/.keep
|
||
│ ├── EmptySubFolder/.keep
|
||
├── Gamma/manual.pdf
|
||
└── T-Share/
|
||
├── EmptyFolder1/.keep
|
||
├── EmptyFolder2/.keep
|
||
```
|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### Q1: .keep文件会影响其他文件吗?
|
||
**答:** 不会。`.keep`是独立文件,不影响其他文件的上传和下载。
|
||
|
||
### Q2: 可以使用其他名称吗?
|
||
**答:** 可以。常见替代名称:
|
||
- `.gitkeep`(Git标准)
|
||
- `.placeholder`
|
||
- `README.md`(如果需要说明文字)
|
||
- `.localized`(macOS系统文件)
|
||
|
||
### Q3: 上传后.keep文件必须保留吗?
|
||
**答:** 可选。如果删除`.keep`:
|
||
- 目录仍然存在(但变为空目录)
|
||
- 不影响其他文件
|
||
- 建议保留(作为目录存在标记)
|
||
|
||
### Q4: webkitdirectory有其他限制吗?
|
||
**答:** 有。其他限制:
|
||
- 无法上传隐藏文件(如`.DS_Store`)← 但MarkBase已支持
|
||
- 无法上传符号链接
|
||
- 无法控制上传顺序
|
||
|
||
---
|
||
|
||
## MarkBase特殊支持
|
||
|
||
**已实现功能:**
|
||
- ✅ 空文件上传(0字节文件)
|
||
- ✅ `.keep`、`.localized`、`.DS_Store`上传
|
||
- ✅ 子目录自动创建(`create_dir_all`)
|
||
- ✅ SHA256校验(包含空文件)
|
||
- ✅ 无文件大小限制
|
||
|
||
**API支持:**
|
||
```bash
|
||
# 上传空文件
|
||
curl -X POST https://download.accusys.ddns.net/api/v2/upload-unlimited/accusys \
|
||
-F "file=@/tmp/test_upload/ExaSAN-DAS/EmptySubFolder/.keep;filename=ExaSAN-DAS/EmptySubFolder/.keep"
|
||
|
||
# 返回:
|
||
{
|
||
"ok": true,
|
||
"filename": "ExaSAN-DAS/EmptySubFolder/.keep",
|
||
"file_size": 0,
|
||
"file_hash": "e3b0c44298fc1c149afbf4c8996fb924..."
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 总结
|
||
|
||
**最佳实践:**
|
||
1. ✅ 使用`prepare_upload.sh`一键处理
|
||
2. ✅ 上传前验证`.keep`文件数量
|
||
3. ✅ 上传后检查目录结构完整性
|
||
4. ✅ 保留`.keep`文件(可选)
|
||
|
||
**适用场景:**
|
||
- ✅ AccuSys下载文件(290个文件)
|
||
- ✅ 产品资料库(多层目录)
|
||
- ✅ 软件发布包(含空目录)
|
||
- ✅ 文档管理系统
|
||
|
||
---
|
||
|
||
**Last Updated:** 2026-06-09 14:45
|
||
**Version:** 2.8 (Empty Directory Support Complete) |