使用formidable接收文件后上传至S3出现0字节问题求助
解决方案:Formidable接收文件后上传AWS S3出现0字节及ArrayBuffer错误
错误原因分析
field.ArrayBuffer() is not a function错误:你通过formidable接收的是PersistentFile对象(服务器本地临时文件实例),而非浏览器端的File对象,因此不存在ArrayBuffer()方法。- 上传文件0字节:未正确读取formidable保存的临时文件内容就进行上传,导致S3接收到空的数据流。
正确实现方案
前提说明
确保已正确配置AWS SDK(以v3为例,v2可对应调整),并传入有效的凭证和区域信息。
方式1:流式上传(推荐,适合大文件)
利用Node.js的文件流直接读取临时文件并上传到S3,避免加载整个文件到内存:
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { createReadStream } from "fs"; // 初始化S3客户端 const s3Client = new S3Client({ region: process.env.AWS_S3_REGION, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, }, }); // 上传函数 async function uploadImageToS3(persistentFile, bucketName, key) { // 从formidable的临时文件路径创建读取流 const fileStream = createReadStream(persistentFile.filepath); const uploadParams = { Bucket: bucketName, Key: key, Body: fileStream, ContentType: persistentFile.mimetype, // 必须带上正确的MIME类型,保证文件可正常预览 }; const command = new PutObjectCommand(uploadParams); await s3Client.send(command); }
方式2:Buffer上传(适合小文件)
读取临时文件到Buffer后再上传:
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { readFile } from "fs/promises"; const s3Client = new S3Client({ /* 同上面的配置 */ }); async function uploadImageToS3(persistentFile, bucketName, key) { // 读取临时文件到Buffer const fileBuffer = await readFile(persistentFile.filepath); const uploadParams = { Bucket: bucketName, Key: key, Body: fileBuffer, ContentType: persistentFile.mimetype, }; const command = new PutObjectCommand(uploadParams); await s3Client.send(command); }
修正主函数调用
在你的AddBlogPost函数中,调用uploadImageToS3时需要传入单个PersistentFile对象(而非数组):
// 原代码中的调用改为: await uploadImageToS3(file[0], bucketName, key);
关键注意点
- 必须使用PersistentFile的
filepath属性:这是formidable在服务器本地保存上传文件的临时路径,是读取文件内容的关键。 - 不要忽略
ContentType:如果不指定,S3会默认将文件类型设为binary/octet-stream,可能导致图片无法直接在浏览器中预览。 - 清理临时文件(可选):formidable默认不会自动删除临时文件,上传完成后可以用
fs.unlink删除,避免占用服务器磁盘空间。
内容的提问来源于stack exchange,提问作者airbender
相关产品推荐
相关产品推荐

