下面我们要定义一个提取图像文件元数据用的命令。在终端,项目所在目录的下面,执行 npm run gc 生成一个命令,名字是 extract-image-metadata ,放在 app/modules/image/commands 目录的下面。
回到项目,打开 ExtractImageMeatadataCommand 这个命令,在它的参数里面,添加一个 filepath 图像文件的路径,值的类型是 string 。
然后打开这个命令对应的处理器,在文件顶部先导入一个包,名字是 exifParser,来自 exif-parser 这个包。再导入一个 fs 模块,来自 fs。
在处理器的 execute 方法里面,准备一下数据,解构一下命令参数,需要的是 filepath,来自 command.params 。
然后检查一下文件是否存在,判断一下 !fs.existsSync 提供给它一个文件路径,这里就是 filepath,如果文件不存在就 return null。
下面可以读取文件,声明一个 image ,它的值用一下 fs.readFileSync 提供一个 filepath。 然后可以解析这个图像。声明一个 metadata,用一下 exifParser 使用它的 create 方法创建一个解析器,提供一个图像文件,这里就是 image,再调用 parse() 这个方法。
最后让命令处理器返回解析图像文件以后得到的元数据,也就是这个 metadata 。
执行命令
打开 FileCreateController 控制器,添加一个构造方法,在方法里面注入一个 CommandBus 依赖。
在创建文件这个接口处理器里面,添加一个参数,用 @UploadedFile 装饰一下,参数的名字是 file,类型是 Express.Multer.File 。
在方法里面声明一个 metadata,类型是 ExifParserResult,它的值就是执行 ExtractImageMetadataCommand 返回的结果。新建一个 ExtractImageMetadataCommand 命令,一个对象参数,里面需要 filepath,值设置成 file.path 。因为方法里用了 await,所以这个方法要用 async 标记一下。
最后我们可以暂时让这个接口返回这个 metadata。
测试
在 Http 客户端测试一下,发送一下这个创建文件请求,接口会执行 ExtractImageMetadataCommand 命令,这里我们看到的响应就是执行这个命令以后得到的结果,它就是包含在图像文件里的一些元数据。
在注意的是,并不是所有的照片里面都有这些数据,因为照片经过处理之后,可能会删除掉这些元数据。