《上传那些事儿之Nest与Koa》——文件格式怎么了!( 二 )

ctx.request.files即可访问前端上传给我们的文件实例,同时我们可以看到我们获取到的是一个WriteStream格式的文件 。通过size、name、type等属性,即可获取相应的属性,用于进行文件格式的校验与判断 。
当我直接使用fs.createReadStream方法将它转换为我们所需要的格式时,问题也随之而来:由于上传后的文件经过了koa的处理,所以我们得到的WriteStream的path发生了一些变化,他变成了内存中的一个地址导致我们转化之后的文件名称也发生了变化,变成了一个内存中的地址串 。
很显然,这是我们不想要看到的,因为这对于我们来说是不可控的 。为了解决这个问题,我尝试了两种解决方式均有效,大家可以自行选择 。
1. 使用koa-body的配置参数,进行地址转存 。
app.use(body({multipart: true,formidable:{// 上传存放的路劲uploadDir: path.join(__dirname,'./temp'),// 保持后缀名\keepExtensions: true,onError(err){console.log(err)}}}));2. 使用fs将文件转存至本地,上传完成后再进行删除
import * as fs from 'fs';const file = ctx.request.files.file;// 通过originalname获取文件原名称const newName = file.originalname;fs.writeFileSync(newName, file.path);const newFile = fs.createReadStream(newName);// 使用newFile进行文件上传 。。。fs.rmSync(newName);在处理文件名称的过程中也可以手动的使用uuid来进行名称的混淆 。有人可能认为,为什么宁愿那么麻烦的获取原来的名称、再使用uuid重新生成新名称,也不愿意直接使用内存地址作为文件名称呢?
很显然,因为这个流程对于我们来说是可控的 。
NestJSexpress

经验总结扩展阅读