@webxrd/body-parser v1.0.0
body-parser(强大的 http报文解析器)
前言
首先: body-parser基于formidable(formidable 1.2.2)之上拓展了额外的功能,功能: 通过添加控制字段 noDownload: true
来阻止文件被自动写入磁盘。并将Buffer数据流 传递给http request。
起因: 无论是formidable、multer还是multipart等body解析器,在提供强大的解析功能时,却在处理文件时并没有提供一个“供使用者可以自己直接操作流数据的功能”。 body-parser由此而生。
例如formidable如果指定uploadDir,则将其下载到uploadDir。 未指定的话:则会默认下载到操作系统内对应的你项目名称的那个temp目录内(也就是操作系统的临时文件,为了验证真实。你可以打印下file.path并去查看下temp目录)。 弊端: 也就是说无论如何 《文件都将被写入磁盘》。而且无法在写入前指定文件名(默认是hash串),你只能在之后通过返回的路径执行rename。 优势: 因为源码上是使用的stream管道流式写入,这么设计的好处就是不会对内存造成压力(因为无需在内存中存储这庞大的文件流)
body-parser提供了解决这种情况的可选项--- noDownload: true
如果你这么做了,那么uploadDir则不会再生效,因为文件不会再被默认写入到任何地方。。而是将Buffer放在file对象上,你可以通过customBinaryStream或customOctetStream来访问它。至此:“写入到哪儿”-“何时写入”与“是否写入”“写入前命名”,这些权利都将直接交给你
body-parser弊端: 假定你使用了 noDownload: true
。(如果你不使用noDownload:true,那么将与formidable无异)
那么意味着文件的数据流在返给你之前,它一直在内存中。不适合高并发的客户端项目,反而是适合少量文件上传的后台管理项目。
安装
npm install @webxrd/body-parser --save
示例————在Express中使用
这里只介绍解构出的 middleware
,它是一个开箱即用的中间件。
(这里form === 原formidable实例,本例不介绍它。欲了解请前往 formidable)
假设前端传来FormData---->>> {fileimg: <binary>}
const formidable = require('@webxrd/body-parser');
const opts = {
noDownload: true
};// opts将保留formidable 原生的一切opts,唯独多了此noDownload字段,且此字段为true时将会影响uploadDir字段
const { form, middleware } = formidable(opts);
// 通过 use 使用body-parser所提供的开箱即用中间件
app.use(middleware);
app.post('/upload', function (request, response) {
// 在这里可以打印fields以及files对象。
console.log(request.fields, '||||||||', 'request.fields')
console.log(request.files, '||||||||', 'request.files')
// 在这里可以直接操作Buffer!这是body-parser所提供的特色
// 获取到的Buffer
console.log(request.files.fileimg.customBinaryStream)
const filePath = './static/images/'+ request.files.fileimg.name
fs.writeFileSync(filePath, request.files.fileimg.customBinaryStream)
response.json({filePath})
});
app.listen(PORT);
示例————在Koa中使用
// 和Express用法相同。区别只在于,取值时是下面这样:
// ctx.request.fields
// ctx.request.files
options
这里只介绍,@webxrd/body-parser所提供的字段。其他所有字段将和formidable一样。您可以参阅它
| 字段 | 类型 | 说明 |
| :--- | :--- | :--- |
| noDownload | Boolean | 默认值false,此时body-parser将和formidable没有任何区别。当设置为true时。uploadDir字段将会失效。并且文件不会再写入到uploadDir或操作系统的temp目录下。与此同时。 file.customBinaryStream或file.customOctetStream
两个字段中将会有一个字段提供Buffer流数据。 |
5 years ago