You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用formidable接收文件后上传至S3出现0字节问题求助

解决方案:Formidable接收文件后上传AWS S3出现0字节及ArrayBuffer错误

错误原因分析

  1. field.ArrayBuffer() is not a function错误:你通过formidable接收的是PersistentFile对象(服务器本地临时文件实例),而非浏览器端的File对象,因此不存在ArrayBuffer()方法。
  2. 上传文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:53:30