一个简单的文件管理器
背景
最近在玩 AI 画图,但有一个问题,画出来的图不知道该怎么存放,也不知道该怎么展示,于是,希望把一些信息存放起来,便于以后使用。
如果要做分布式,最好是无状态,把 AI 生成的图片和所产生的信息以文件的形式管理,方案类似于 Minio (一个文件,一个 .sys 的 fs.json 文件)
这是一个文件的例子:
1 |
|
技术选择
在存储的信息上,主要需要如下信息:
1 |
|
文件信息的存储,可以和文件放在一块儿,也可以放在一个可以获取到的地方,放在文件尾部,则需要做专门的解析,管理起来更方便,但使用的灵活性更低。
文件信息也可以存储在一个特定的数据库中,例如中央的 mongodb、关系数据库、kv 数据库等。
元信息存储选型
从图片管理软件 eagle 的方案来看,选择了直接存储 json 文件的方式,对于小批量文件,这确实是一个非常好用的方式,当然,如果是大批量文件,也可以在服务器端使用内存的方式优化。
使用 sqlite 的好处,在于所有信息均在一个 sql 数据库中,可以使用 SQL 的方式做查询,而且是现成的非常成熟的方案,用起来非常方便。同样,sqlite 的弊端就是中央存储,分布式下数据同步不大好处理(当然是能处理的,只是没有文件来的方便)
综合考虑来看,保证文件的独立可用是一个重要的特性,因此先采用 json 文件存储的方式,使用文件全路径作为文件名,使用 同名 + .json
的隐藏文件作为 meta 文件信息。
在实际使用时,需要配置一系列存储地址配置,作为存储基本信息的配置。
功能清单
- 基本的 增删改查
- download cache (下载文件作为 cache)
- 图片的压缩 (对于一些大图片,可做压缩处理)
从交互形式上,有如下特征:
- 要支持可以直接操作文件夹内的文件
- 要支持可通过接口操作文件
- 要支持 sync 的操作 (同步合并) [以后]
- 要支持导入导出为 sql 的操作 [以后]
当前,可做如下事项:
- 提供一个 local cli client,支持 cache、check update
- 提供一个 server,支持增删改查
- 提供一个 api cli client,支持增删改查
实际使用时,发现还是 sqlite 好用,于是决定作为第一版,先使用 sqlite 吧。
之前走了一些弯路,认识到几个问题:
自己的产品设计能力还很欠缺,导致对产品的交互形态没有较好的把控力,在思维上很混乱,看起来就像是:这也想要,那也想要。 最终也不知道该怎么落地。
起项目时,不能在还没什么思路的时候就上 copilot,这样只会让思路更混乱,暂时还不能把框架结构交给一个可能性很多的工具,要能完全 hold 住各种情况以后才能发挥出其拓宽思路的价值。
不管怎么说,先写了一版基础的,先用着吧,具体的项目在 baipiaofs (由于有一些隐秘的内容,暂时先设置为 private)
实际使用
后续思考
- 元信息管理要能同步
- 元信息要完全兼容文件系统
- backend 以后要有很多的扩展性,要能很方便地集成多个不同 backend,并且要完全屏蔽 backend
- 要能做文件的容错、迁移
实际上,就是把类似于分布式存储的 backend 通过一套接口,放到了多种 backend 中。
There is only one corner of the universe you can be certain of improving, and that’s your own self.
— Aldous Huxley
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!