NodeJS接收前端文件并转为base64


前端传文件过来一般是通过FormData数据传递,而解析FormData数据,就得用到了Multiparty模块,与之功能类似的还有Formidable,在这里只用到了Multiparty

安装

1
npm i Multiparty

使用

创建一个新表单

option为配置选项,见下文,可填可不填,不填可以在后面通过如form.encoding = 'utf-8'手动设置

1
2
const multiparty = require("multiparty")
const form = new multiparty.Form(option)
解析FormData数据
1
2
form.parse(req, (err, fields, files) => {
})

利用parse(request, callback)方法解析,接收两个参数requestcallback,无返回值

  • request:request对象,把创建服务时的回调函数的第一个参数req传进去即可
  • callback:回调函数,可以获取到解析后的数据,且默认自动开启了autoFieldsautoFlies,如果要文件上传的话只需要提前设置好uploadDir,插件就已经帮你做完一切了

回调函数内有三个参数errfieldsfiles

  • err:发生错误时,返回的错误信息
  • fields:一个对象,存储着FormData里的字段信息
  • files:存储着文件信息,如果前端把整个file对象直接放进formData内,则有值,否则为空对象。

常用配置选项

详细配置参考Multiparty文档

  • encoding:formdata的数据设置编码,默认是utf-8
  • maxFieldsSize:限制所有字段按字节分配的内存量,默认是2M,超出则会产生错误。
  • maxFields:限制被解析字段的数量,默认为1000
  • maxFilesSize:此属性只有在autoFiles为true的时候生效,限制最大能上传多大的文件
  • autoFields:启用字段事件,并禁用字段的部分事件。如果监听字段事件,该属性自动为true。
  • autoFiles:启用文件事件,并禁用部分文件事件,如果监听文件事件,则默认为true
  • uploadDir:放置文件的目录,只有autoFiels为true时有效

文件转换为base64

1
2
3
4
const readData = fs.readFileSync(file.path, 'binary') // 根据文件路径读取文件数据
const srcBase64 = Buffer.from(readData, 'binary').toString('base64') // 根据文件数据获取base64(不包含头部)
const headerSrc = 'data:image/' + path.extname(file.path).substr(1) + ';base64,' // 手动生成头部部分
console.log(headerSrc + srcBase64)

整体代码

该代码实现了从前台接收上传的图片,并将其转换为base64格式功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 引入multiparty 
const multiparty = require("multiparty")

// 创建一个新表单
const form = new multiparty.Form()

// 设置配置选项
form.encoding = 'utf-8'
form.maxFieldsSize = 10 * 1024 * 1024

// 解析FormData数据
form.parse(req, (err, fields, files) => {
// 注:这里multiparty进行了自动上传,files中包含自动上传后的文件路径,因此可以通过路径读取文件数据
const file = files.file[0]
const readData = fs.readFileSync(file.path, 'binary')
const headerSrc = 'data:image/' + path.extname(file.path).substr(1) + ';base64,'
const srcBase64 = Buffer.from(readData, 'binary').toString('base64')
console.log(headerSrc + srcBase64) // 打印图片base64数据
}

参考

nodejs之multiparty插件使用简析
nodejs读取图片并将二进制数据转换成base64格式