一个简单的文件管理器

背景

最近在玩 AI 画图,但有一个问题,画出来的图不知道该怎么存放,也不知道该怎么展示,于是,希望把一些信息存放起来,便于以后使用。

如果要做分布式,最好是无状态,把 AI 生成的图片和所产生的信息以文件的形式管理,方案类似于 Minio (一个文件,一个 .sys 的 fs.json 文件)

这是一个文件的例子:

1
{"version":"1.0.2","checksum":{"algorithm":"","blocksize":0,"hashes":null},"meta":{"content-type":"application/octet-stream","etag":"05acd5df2ba7a8178e86c3b676fef6d4"}}

技术选择

在存储的信息上,主要需要如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- filename
- filepath
- saving_path (1 vs n)
- fs://xx/usr/xx/photo/3lz9n4s148Ux3/xx.png
- piaooss://xxx/lst/test/4k0dLd2x0/hello.jpeg
- 文件元信息
- mime
- checksum
- size
- tags
- attributes (xx=xx, eg: person=longalong, place=beijing)
- desc
- sid (加密相关信息)
- create_time
- update_time
- delete_time
- other (eg: prompts)
- version
- local_info
- from (从哪里下载的)
- get_time
- check_time

文件信息的存储,可以和文件放在一块儿,也可以放在一个可以获取到的地方,放在文件尾部,则需要做专门的解析,管理起来更方便,但使用的灵活性更低。

文件信息也可以存储在一个特定的数据库中,例如中央的 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)

实际使用

piaofs使用演示

后续思考

  • 元信息管理要能同步
  • 元信息要完全兼容文件系统
  • 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 协议 ,转载请注明出处!