用户登录

打开 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,表示大尺寸的图像。

定义文件服务接口《 Nest.js 企业级后端实践:文件服务 》

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点