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

如何在Next.js API路由中读取PrimeReact上传的XML内容?

如何从PrimeReact FileUpload上传的请求中提取纯XML内容(Next.js 12.3)

你当前直接打印req.body得到的是multipart/form-data格式的原始请求内容,包含分隔边界、文件头和XML正文,需要先解析这个格式才能提取纯XML文本。下面是具体解决方案:

步骤1:安装multipart解析工具

Next.js默认不处理multipart/form-data类型的请求,需要用formidable包来解析。执行安装命令:

npm install formidable
# 或用yarn
yarn add formidable

如果用TypeScript,额外安装类型声明:

npm install @types/formidable --save-dev

步骤2:修改API路由代码

修改你的/api/admin/edcupload路由文件,禁用Next.js默认的body解析,用formidable处理请求并读取XML内容:

import type { NextApiRequest, NextApiResponse } from 'next';
import { IncomingForm } from 'formidable';
import fs from 'fs/promises';

// 禁用Next.js默认的body解析,让formidable处理原始请求
export const config = {
  api: {
    bodyParser: false,
  },
};

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  // 只处理POST请求
  if (req.method !== 'POST') {
    return res.status(405).json({ message: '仅支持POST请求' });
  }

  const form = new IncomingForm();

  try {
    // 解析请求,获取表单字段和文件
    const { files } = await new Promise((resolve, reject) => {
      form.parse(req, (err, fields, files) => {
        if (err) reject(err);
        resolve({ fields, files });
      });
    });

    // 获取上传的XML文件(对应FileUpload组件的name属性"edcStock")
    const xmlFile = files.edcStock;
    if (!xmlFile) {
      return res.status(400).json({ message: '未上传XML文件' });
    }

    // 读取文件内容,得到纯XML文本
    const xmlContent = await fs.readFile((xmlFile as any).filepath, 'utf8');
    console.log('提取的纯XML内容:', xmlContent);

    // 这里可以添加你的业务逻辑,比如解析XML、存储内容等

    return res.status(200).json({ message: '文件处理成功', xmlContent });
  } catch (error) {
    console.error('处理上传文件出错:', error);
    return res.status(500).json({ message: '文件处理失败' });
  }
}

关键说明

  • 必须禁用Next.js的默认body解析:因为multipart/form-data需要原始请求流来解析,Next.js自动解析会破坏原始数据。
  • 读取文件路径:formidable会把上传的文件临时存储在服务器上,通过filepath属性获取临时文件路径,读取后即可得到纯XML内容。
  • 类型处理:如果用TypeScript,files.edcStock的类型需要断言,安装@types/formidable后可以使用更准确的类型定义。
  • 可选校验:可以额外判断文件的MIME类型是否为text/xml,避免非XML文件上传:
    if ((xmlFile as any).mimetype !== 'text/xml') {
      return res.status(400).json({ message: '仅支持XML格式文件' });
    }
    

内容的提问来源于stack exchange,提问作者Chris Hunter-Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:05:18