Node.js中如何从Formidable解析对象提取Blob、ArrayBuffer/TypedArray
Formidable 上传文件写入磁盘/提取ArrayBuffer 实现方案
依赖引入
你不需要引入额外第三方类库,仅需使用Node.js内置模块即可:
fs/fs/promises:Node.js内置文件操作模块,负责文件读写、拷贝、删除操作path:可选,用于跨平台拼接文件路径,避免Windows/macOS路径分隔符兼容问题
推荐实现(无需手动提取ArrayBuffer)
formidable 处理上传文件时,默认已经将你传输的Blob内容写入到了系统临时目录,对应路径就是PersistentFile对象的filepath字段,你不需要手动读取Blob转ArrayBuffer,直接将临时文件拷贝/移动到目标存储路径即可,这种方案不占用额外进程内存,大小文件都适配,性能最优。
注意:C盘根目录默认需要管理员权限才能写入,建议将文件存储到C盘下你自行创建、拥有读写权限的文件夹中,避免触发权限报错。
对应实现代码:
const fs = require('fs/promises'); formParser.parse(req, async (err, fields, files)=>{ if(err) throw err; const fileInfo = JSON.parse(fields.JSON); // 获取解析后的上传文件对象 const tempFile = files.Binary; // 定义C盘下的目标存储路径,请替换为你自己的实际路径 const targetSavePath = 'C:\\your-custom-folder\\uploaded-img.png'; // 拷贝临时文件到目标路径 await fs.copyFile(tempFile.filepath, targetSavePath); // 拷贝完成后删除临时文件,避免临时目录堆积垃圾文件 await fs.unlink(tempFile.filepath); // 后续业务逻辑 })
需提取ArrayBuffer场景的实现方法
如果你有特殊业务需求(比如图片二次处理、文件内容校验等)必须拿到文件的ArrayBuffer,直接读取临时文件内容转换即可:
const fs = require('fs/promises'); formParser.parse(req, async (err, fields, files)=>{ if(err) throw err; const fileInfo = JSON.parse(fields.JSON); const tempFile = files.Binary; const targetSavePath = 'C:\\your-custom-folder\\uploaded-img.png'; // 读取临时文件为Buffer对象(Node.js中Buffer是Uint8Array的子类,可直接在大部分支持ArrayBuffer的场景使用) const fileBuffer = await fs.readFile(tempFile.filepath); // 如需获取纯净的ArrayBuffer对象,按内存偏移截取正确长度的内容(避免内存池分配带来的冗余数据) const arrayBuffer = fileBuffer.buffer.slice( fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength ); // 拿到ArrayBuffer后即可调用fs.writeFile写入目标路径 await fs.writeFile(targetSavePath, Buffer.from(arrayBuffer)); // 写入完成删除临时文件 await fs.unlink(tempFile.filepath); // 后续业务逻辑 })
注意事项
- 不要直接读取
fileBuffer.buffer作为ArrayBuffer使用:Node.js的Buffer默认会从共享内存池分配内存,直接取buffer属性会携带不属于当前文件的冗余内存数据,必须按byteOffset和byteLength截取才是正确的文件内容。 - 如果你使用回调风格的fsAPI,把上述await写法替换成对应的回调函数即可,核心逻辑不变。
内容的提问来源于stack exchange,提问作者Rodion N.
相关产品推荐
相关产品推荐

