Node.js/Next.js中new File未定义报错,求可行解决方案
Node.js中使用FormData处理本地文件的解决方案
问题原因
Node.js(包括Next.js服务端代码)没有浏览器环境的File构造函数,直接调用new File会抛出ReferenceError: File is not defined错误。
替代方案
根据你的Node.js版本,有两种可靠的实现方式:
1. Node.js 18+ 原生FormData(推荐)
Node.js 18及以上版本内置了符合标准的FormData,支持直接传入Buffer,无需模拟File对象:
import fs from 'node:fs'; import { FormData } from 'node:formdata'; const imageBuffer = fs.readFileSync(filepath || ''); const body = new FormData(); // 直接传入Buffer,通过第三个参数配置文件信息 body.append('file', imageBuffer, { filename: originalFilename || 'unknown.png', type: 'image/png' // 根据实际文件类型修改,比如image/jpeg });
2. 旧版本Node.js(<18):使用form-data第三方库
先安装依赖:
npm install form-data
然后通过库提供的API处理文件:
const fs = require('fs'); const FormData = require('form-data'); const imageBuffer = fs.readFileSync(filepath || ''); const body = new FormData(); body.append('file', imageBuffer, { filename: originalFilename || 'unknown.png', contentType: 'image/png' });
优化:处理大文件(避免内存占用过高)
如果文件较大,推荐使用文件流替代readFileSync,减少内存消耗:
// 原生FormData示例 body.append('file', fs.createReadStream(filepath), { filename: originalFilename || 'unknown.png', type: 'image/png' }); // form-data库示例 body.append('file', fs.createReadStream(filepath), { filename: originalFilename || 'unknown.png', contentType: 'image/png' });
总结
无需刻意模拟浏览器的File对象,Node.js的FormData实现支持直接传入Buffer或文件流,通过配置filename和type/contentType参数,就能满足大多数接口的文件上传需求。
内容的提问来源于stack exchange,提问作者Riky Andreas
相关产品推荐
相关产品推荐

