formidable处理提交的表单或图片文件的简单介绍

一般来说,客户端向服务端提交数据有GETPOST这两种方式,在之前的文章node.js当中的http模块与url模块的简单介绍 当中我们可以知道通过req.urlurl模块的配合处理可以快速得到客户端通过GET方式向服务端提交的数据。而原生的node.js在处理客户端以POST方式提交的数据时,比较复杂,要写两个监听,并且要处理上传的图片、文件也比较艰难。故我们常用第三方模块包formidable来处理客户端以POST方式提交的表单、文件、图片等。

一、formidable处理POST方式提交的表单数据

1、下载并引包

在当前的项目文件夹下,用命令-> npm install formidable 来在当前文件夹下载formidable。再通过const formidable = require('formidable');来引包。

2、创建基本的表单结构

我们新建一个表单页面form.html放在服务端,与主文件1.js放在同一个目录下。如下图所示:

图片描述

在主文件1.js当中,我们设计路由为,当用户访问根目录时,呈递该表单页面,当用户完成表单信息填写,用submit进行提交之后,默认跳转至路由http://192.168.155.1:3000/dopost,(一定要加上指定的端口号),则我们设计在这一条路由当中来使用formidable来进行处理。则1.js主文件的骨架代码为:

const formidable = require('formidable');
const fs = require('fs');
const path = require('path');
const http = require('http');
var server = http.createServer((req,res)=>{
    if(req.url == '/'){
        var target = path.join(__dirname,'./form.html');
        fs.readFile(target,(err,data)=>{
            if(err) throw err;
            res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
            res.end(data);
        });
    }else if(req.url == '/dopost' && req.method.toLowerCase() == 'post'){
        
    }else{
        res.writeHead(404,{"Content-Type":"text/html;charset=UTF8"});
        res.end("找不到该页面!");
    }
});
server.listen(3000,'192.168.155.1');
3、使用formidable来处理表单数据

常用代码段为

var form = new formidable.IncomingForm();
form.parse(req,function(err,fields,files){});

其中当服务端全部接收完客户端用post方式提交的表单数据之后,触发执行该回调函数。以post方式提交的表单域数据都放在fields这个对象当中,以post方式上传的文件、图片等文件域数据都放在files这个对象当中。
则我们在第二条路由选择的分支当中的代码示例为:

else if(req.url == '/dopost' && req.method.toLowerCase() == 'post'){
    var form = new formidable.IncomingForm();
    form.parse(req,function(err,fields,files){
        if(err) throw err;
        console.log(fields);
        res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
        res.end('表单提交成功!');
    });
}

此时完成表单数据填写并提交之后,结果为:

图片描述

二、formidable处理POST方式上传的文件或图片

通过上述方式进行下载与引包之后,form.html文件与主文件1.js仍处于同一目录下,form.html当中的示例代码为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form表单</title>
</head>
<body>
    <form action="http://192.168.155.1:3000/dopost" method="POST" enctype="multipart/form-data">
        <p><input type="file" name="uploadImg"></p>
        <p><input type="submit" value="提交"></p>
    </form>
</body>
</html>

当表单提交的过程中涉及文件或图片上传,则一定要设置表单头,即在form标签上加上固定写法的属性为enctype="multipart/form-data",否则文件或图片会上传失败。其中<input type="file" name="uploadImg">,当中的name属性一定要赋值。

其中主文件1.js的骨架代码也与上述的相似。当要使用formidable来处理上传的图片时,常用的代码段为:

var form = new formidable.IncomingForm();
form.uploadDir = targetFile;
form.parse(req,function(err,fields,files){});

其中targetFile为一个自定义的变量,用于设置文件或图片上传的存放路径,为绝对物理路径。该目标地址的文件夹必须能实现存在,这样才能确保文件能顺利上传。其中当服务端全部接收完客户端用post方式提交的文件或图片之后,触发执行该回调函数。以post方式提交的表单域数据都放在fields这个对象当中,以post方式上传的文件、图片等文件域数据都放在files这个对象当中。则我们在第二条路由选择的分支当中的代码示例为:

else if(req.url == '/dopost' && req.method.toLowerCase() == 'post'){
        var form = new formidable.IncomingForm();
        var targetFile = path.join(__dirname,'./upload');
        form.uploadDir = targetFile;
        form.parse(req,function(err,fields,files){
            if(err) throw err;
            console.log(files);
            res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
            res.end('表单提交成功!');
        });
}

在完成图片的选择与上传之后,结果为:

图片描述

此时可以看到在主文件1.js的同一目录下的upload文件夹当中多了一个随机名字,并且没有后缀名的文件。由于没有后缀名,所以该图片在编辑器当中无法正常显示。

图片描述

我们可以在接收到上传的图片之后,使用fs.rename()方法对其进行改名的操作,使其上传之后的文件名与之前的保持一致,并且包含后缀名的部分。
我们从控制台打印的信息可以看出其中files.uploadImg.path代表该图片上传之后存放的绝对物理路径。其中files.uploadImg.name代表该图片原来的文件名部分(包含扩展名的信息)。我们加入了上传改名的功能之后,第二条路由选择分支当中的示例代码为:

else if(req.url == '/dopost' && req.method.toLowerCase() == 'post'){
        var form = new formidable.IncomingForm();
        var targetFile = path.join(__dirname,'./upload');
        form.uploadDir = targetFile;
        form.parse(req,function(err,fields,files){
            if(err) throw err;
            var oldpath = files.uploadImg.path;
            var newpath = path.join(path.dirname(oldpath),files.uploadImg.name);
            fs.rename(oldpath,newpath,(err)=>{
                if(err) throw err;
                res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
                res.end('图片上传并改名成功!');
            })
        });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 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 中实现文件上传的简单方法!注意,这只是一个基本示例,实际中需要添加更多的错误处理和验证逻辑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值