express+formidable 实现接收上传文件

express框架
  • 安装express

    npm i express 

  • 下载骨架生成器

    npm i express-genrator -g

  • 创建express文件夹

    express -e 文件名

  • 生成project.json

    npm init

formidable 处理上传文件请求的插件--【在路由里写】
  • 安装formidable

    npm i formidable

  • 导入
  • const formidable=require('formidable')
    
    const {IncomingForm}=require('formidable')
  • 创建表单对象
  • const form = new IncomingForm({ 
        multiples: true, 
        uploadDir:__dirname+'/../public/images'
    });
    form.options.keepExtensions=true 
  • 解析请求报文
  • form.parse(req, (err, fields, files) => {
        if (err) {
          next(err);
          return;
        }  
        res.json({ fields, files });
      
    });

index.js代码
var express = require("express");
var router = express.Router();

const path = require("path");
const formidable = require("formidable");
const {IncomingForm} = require("formidable");

/* GET home page. */
router.get("/", function (req, res, next) {
  res.render("index", { title: "Express" });
});
// 显示网页的表单
router.get("/portrait", (req, res) => {
  res.render("portrait");
});
// 处理文件上传
router.post("/portrait", (req, res) => {
  // 创建表单对象
  const form = new IncomingForm({ 
    multiples: true,
    uploadDir:__dirname+'/../public/images'
  });
  // 保存文件后缀
  form.options.keepExtensions=true 

  // 解析报文请求
  form.parse(req, (err, fields, files) => {
    if (err) {
      next(err);
      return;
    }
    // 保存该图片的url
    let url='/images/'+files.portrait[0].newFilename
   
    res.json({ fields, files,url });
    // res.send(url)
  });
});

module.exports = router;
views下portrait.ejs代码--【主要是为了发送post请求】
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>文件上传</h2>
    <form action="/portrait" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="username">
        图片:<input type="file" name="portrait">
        <button>提交</button>
    </form>
</body>
</html>
get请求

post请求

图片自动保存到public/images下

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Next.js 和 React 中实现文件,可以使用一个称为 `formidable` 的库。 `formidable` 是一个流行的 Node.js 库,用于处理表单数据和文件。它提供了一个简单的 API,可以轻松地将文件到服务器。 以下是一个使用 `formidable` 在 Next.js 和 React 中实现文件的示例: 首先,安装 `formidable`: ``` npm install formidable ``` 然后,在你的 Next.js 页面中,创建一个处理文件的路由: ```javascript import formidable from 'formidable'; export const config = { api: { bodyParser: false, }, }; export default async function handler(req, res) { if (req.method === 'POST') { const form = formidable({ multiples: true }); form.parse(req, (err, fields, files) => { if (err) { console.error(err); res.status(500).json({ error: err.message }); return; } // 处理文件 console.log(files); res.status(200).json({ message: '文件成功!' }); }); } else { res.setHeader('Allow', ['POST']); res.status(405).json({ message: `Method ${req.method} Not Allowed` }); } } ``` 在上面的代码中,我们创建了一个名为 `handler` 的异步函数。它检查请求方法是否为 `POST`,如果是,就创建一个 `formidable` 实例,然后调用 `parse` 方法来解析请求中的表单数据和文件。如果解析过程中出现错误,返回一个错误响应。否则,我们可以在这里处理文件。 现在,在你的 React 组件中,你可以创建一个表单来上文件。使用 `fetch` 方法将表单数据和文件到服务器: ```javascript import React, { useState } from 'react'; export default function UploadForm() { const [file, setFile] = useState(null); const handleSubmit = async (e) => { e.preventDefault(); if (!file) return; const formData = new FormData(); formData.append('file', file); try { const res = await fetch('/api/upload', { method: 'POST', body: formData, }); const data = await res.json(); console.log(data); } catch (err) { console.error(err); } }; return ( <form onSubmit={handleSubmit}> <input type="file" onChange={(e) => setFile(e.target.files[0])} /> <button type="submit">上文件</button> </form> ); } ``` 在上面的代码中,我们创建了一个名为 `UploadForm` 的组件。它包含一个表单元素和一个文件选择器,用于选择要上文件。当表单提交时,我们使用 `FormData` API 将文件添加到表单数据中,并将其作为 `fetch` 方法的 `body` 发送到服务器。 这就是在 Next.js 和 React 中实现文件的简单方法!注意,这只是一个基本示例,实际中需要添加更多的错误处理和验证逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值