strapi上传具有依赖关系文件的一种解决方案

3D模型文件,不同于一般的网络资源文件。这些3D模型文件很多是具有相互依赖关系的。例如obj,依赖于mtl,然后一个mtl文件可能还依赖好几个图形文件。这是3D系统的特点所决定的,因为3D模型通常包含几何数据,材质数据,然后还有各种纹理数据。这些都可能位于不同文件。

这一个特征对于上传3D资源并备用,就稍微有点麻烦了。因为很多cms系统默认上传文件后,为了便于管理都会重新命名文件。上传之后,再到下载时所有的url就与文件名不同了。主流的cms系统几乎都是这么工作的。例如wordpress, strapi都会为每个文件生成一个唯一的文件名,然后保存在某个地方的文件系统。

因此,我们需要保留文件原名,但是又要避免未来文件太多而导致的文件重名。创建一个唯一的目录(这是针对local策略,如果使用七牛,亚马逊云啊之类的策略也有相类似的方式),然后再在该目录下保存文件是一种便利的解决方案。strapi允许用户通过extensions定制插件,而且允许用户创建provider,我们可以利用这点,定制upload插件,然后修改一下provider来实现此目的。

通过以下几个具体的步骤即可实现此方案:

  1. 规定,所有的上传文件操作,新添加一个keepname字段。如果此字段为"true"则,让服务器做特殊对待。
  2. 重写extensions/upload/service/Upload.js文件,修改upload函数中的内容,里面对meta.keepname做一个判断,如果此值为"true",则让后面所有的provider.upload和provider.delete操作的参数都添加一个updir字段。updir字段的值可以由uuidv4来生成。
  3. 上一步中的updir需要持久化保存到数据库中,因此还需要修改extensions/upload/model/File.setting.json文件。为其中添加updir字段。
  4. 修改或重写strapi-provider-upload-local插件,为其中的upload和delete函数增加处理updir的功能。并且注意修改其url的赋值。我已经开源了一个provider插件来实现此功能。

发表评论

邮箱地址不会被公开。 必填项已用*标注