打开 FileServeController ,在文件顶部,从 express 这个包里面,导入一个 Response ,来自 express 这个包。
在这个控制器里面添加一个构造方法,然后先注入一个 QueryBus 这个依赖。
下面再去定义一个文件服务接口,处理器的名字是 serveFile,方法用 async 标记一下。方法上面用 @Get 装饰一下,地址是 files/:fileId/serve 。
这个接口处理器需要几个参数,用 @Res 装饰器,把它的 passthrough 设置成 true,用它装饰一下 response 参数,类型是 Response。再用一个 @Param 装饰器,需要的是 fileId 这个地址参数,名字是 fileId,类型是 number。然后用 @Query 装饰一个 query 参数,类型是 ServeFileQueryDto。
在处理器里面,声明一个 file 类型是 FileEntity ,等于 await 执行一个查询,新建一个 GetFileQuery 提供一个对象参数,需要一个 fileId 。
下面声明一个 fileStream ,这里需要用到 FileService 里的一个方法,在构造方法里面注入一个依赖,需要的是 fileService 类型是 FileService。
设置一下 fileStream 的值,用一下 this.fileService.getFileStream ,提供一个 file.filename 还有 query.size 。然后设置一下响应的头部,response.set,一个对象,添加一个 Content-Type,对应的值是 file.mimetype 。
最后 return 的东西可以新建一个 StreamableFile,提供一个 fileStream。
测试
在 Http 客户端,在文件目录的下面新建一个请求,名字是文件服务,请求方法设置成 GET,配置一下请求地址,一个基本的地址,加上 files ,然后是文件的 id,斜线,再加上一个 serve。发送一下这个请求。
提示 size 查询符必须有值,在接口地址里面添加一个 size 查询符,值可以设置成 thumbnail ,再发送一下这个请求,这里得到了一个状态码是 500 的响应,说明服务出了点问题,在控制台可以观察一下,这里提示 no such file or directory 。
回到项目,打开 FileService ,找到 getFilePath 这个方法里的 fileExist ,这里应该要用的是 fs 模块的 existsSync ,不是 readFileSync,这个 readFileSync 会同步读取文件,如果文件不存在,就会报刚才我们在控制台上看到的错误。
回到 Http 客户端,重新发送一下文件服务请求,提示文件不存在,下面可以换一个文件 id ,然后现发送一下这个请求,如果图像文件存在,得到的响应就是这个图像文件。
现在得到的是 thumbnail 这种尺寸的图像,修改一下 size 查询符的值,换成 medium 再试一下,这回得到的就是中等尺寸的图像,另外这个 size 的值还可以是 large,表示大尺寸的图像。