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

在Next.js中处理multipart/form-data文件:如何获取路径或缓冲区?

问题

我尝试从前端向后端上传图片,但遇到了问题。前端发送包含“image”的数据到后端;后端使用Next.js编写,代码如下:

//Imports
import { NextResponse } from 'next/server';
import fs from 'fs';
import formidable from 'formidable';


//disabling nextjs default body parser
export const config = {
  api: { bodyParser: false },
};


export async function POST(request) {
   //get data from body
   const formData = await request.formData();

   //get logo image file
   const logo = formData.get('business_logo');
   
   console.log(logo);//output is below

   //default 
   return NextResponse.json(request)
};

控制台输出的logo为:

File {
  size: 686117,
  type: 'image/jpeg',
  name: '102311052-customer moldbase - ZOOM in to obscure customer content.JPEG',
  lastModified: 1721648713221
}

我想获取文件路径或buffer用于后续处理(如上传到BunnyCDN或保存到本地),但尝试用fs.readFile时因为返回的是对象而未成功,该怎么解决?

解决方案

从formData.get()拿到的logo是浏览器标准的File对象,它没有本地文件路径(前端上传的文件不会暴露本地路径),但你可以直接将它转换为Buffer或读取为数据流来处理:

1. 获取文件Buffer

调用File对象的arrayBuffer()方法,再转换为Node.js的Buffer:

export async function POST(request) {
  const formData = await request.formData();
  const logo = formData.get('business_logo');

  // 转换为ArrayBuffer后转成Buffer
  const arrayBuffer = await logo.arrayBuffer();
  const buffer = Buffer.from(arrayBuffer);

  // 后续可使用buffer完成上传CDN、本地存储等操作
  console.log('文件Buffer长度:', buffer.length);

  return NextResponse.json({ message: '文件处理完成' });
}

2. 保存到本地文件

结合Node.js的fs.promises.writeFile,用Buffer写入文件:

import { NextResponse } from 'next/server';
import fs from 'fs/promises';
import path from 'path';

export const config = {
  api: { bodyParser: false },
};

export async function POST(request) {
  const formData = await request.formData();
  const logo = formData.get('business_logo');

  // 构建保存路径(注意:Next.js生产环境建议用临时目录或云存储,避免文件丢失)
  const savePath = path.join(process.cwd(), 'public/uploads', logo.name);
  
  // 转换为Buffer后写入文件
  const arrayBuffer = await logo.arrayBuffer();
  const buffer = Buffer.from(arrayBuffer);
  await fs.writeFile(savePath, buffer);

  return NextResponse.json({ message: '文件保存成功', filePath: savePath });
}

注意:public目录在Next.js生产环境属于静态资源目录,频繁写入可能引发部署问题,推荐使用系统临时目录(os.tmpdir())或云存储服务。

3. 上传到BunnyCDN

BunnyCDN支持直接传入Buffer上传,以官方SDK为例(需先安装bunnycdn-storage包):

import { NextResponse } from 'next/server';
import { Storage } from 'bunnycdn-storage';

export const config = {
  api: { bodyParser: false },
};

export async function POST(request) {
  const formData = await request.formData();
  const logo = formData.get('business_logo');

  // 初始化BunnyCDN存储客户端
  const storage = new Storage(process.env.BUNNYCDN_STORAGE_ZONE, process.env.BUNNYCDN_API_KEY);

  // 转换为Buffer后上传
  const arrayBuffer = await logo.arrayBuffer();
  const buffer = Buffer.from(arrayBuffer);
  
  // 上传到BunnyCDN指定路径
  await storage.putFile(`uploads/${logo.name}`, buffer);

  return NextResponse.json({ message: '文件上传到BunnyCDN成功' });
}

内容的提问来源于stack exchange,提问作者Pratik Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:18:19