node.js - 如何在Next Js中以表单数据发送文件?

标签 node.js reactjs api next.js

我在 Node js 中创建了一个用于文件上传的 API。它与 postman 一起工作正常。

我在Next Js中制作了一个用于上传Excel文件的表单。我可以在控制台中看到选定的文件。

但我无法在 formdata 中设置该文件。我在控制台中收到空表单数据。

<div>
        <input
          class="form-control w-25"
          multiple={false}
          type="file"
          id="ExcelFile"
          onChange={uploadFile}
          required
        ></input>
        {/* </label> */}
        <button
          type="button"
          // disabled={!selectedImage}
          class="btn btn-primary "
        >
          ADD SOLUTION
        </button>
      </div>

const uploadFile = ({ target: { files } }) => {
    console.log(files[0]);
    // let data = new formData();
    let FilesData = new FormData();
    FilesData.append("excel_file", files[0]);
    console.log("Files in multipart");
    console.log(FilesData);
    // data.append("file", files[0]);
  };

https://codesandbox.io/embed/next-js-forked-th22n?fontsize=14&hidenavigation=1&theme=dark

最佳答案

这是一个使用 multernext.js 中提交简单表单的小示例解析表单数据。

客户端

这是客户端页面,包含一个 super 简单的 HTML 表单(无需 JS 也可以工作)

// pages/my-form.ts

export default function Page() {
  return (
    <div>
      <form id="data" method="post" action='/api/on-form-submit' encType="multipart/form-data">
        <input name="title" label="Title"/>
        <input name="video" label="Video"/>

        <button type="submit">Submit</button>
      </form>
    </div>
  );
};

服务器

这是将接收表单提交的服务器函数。

// pages/api/on-form-submit.ts

import multer from "multer";
import { NextApiRequest, NextApiResponse } from "next";

async function parseFormData(
  req: NextApiRequest & { files?: any },
  res: NextApiResponse
) {
  const storage = multer.memoryStorage();
  const multerUpload = multer({ storage });
  const multerFiles = multerUpload.any();
  await new Promise((resolve, reject) => {
    multerFiles(req as any, res as any, (result: any) => {
      if (result instanceof Error) {
        return reject(result);
      }
      return resolve(result);
    });
  });
  return {
    fields: req.body,
    files: req.files
  }
}

// IMPORTANT: Prevents next from trying to parse the form
export const config = {
  api: {
    bodyParser: false,
  },
};

const Handler: NextApiHandler = async (req, res) => {
  const result = await parseFormData(req, res);
  console.log(result);
  res.status(200).redirect('/success-page');
}
export default Handler;

关于node.js - 如何在Next Js中以表单数据发送文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69478495/

相关文章:

reactjs - React 使用 useState 钩子(Hook)有效地更新数组中的对象

api - GetMapping 在 spring boot 中返回错误 405

javascript - react 应用程序 : Start API server with React server

android - Android 中的 Google+ : installing app when sharing

node.js - 如何修复 "Error: listen EADDRINUSE: address already in use:::5000"未处理的 'error' 事件

javascript - Ubuntu 上 Apache 服务器上的 Proxypass 套接字 io

javascript - ERROR : Maximum update depth exceeded. 当组件重复调用时可能会发生这种情况

reactjs - 谷歌 AMP 与 React

node.js - 使用 join、group by、having、order by 进行 Sequelize

linux - 需要一些帮助来为 nodejs 应用程序创建 rpm 包