通过formidable中间件实现文字图片同时上传

目前 Node.js 在大部分领域都占有一席之地,尤其是 I/O 密集型的,比如 Web 开发,微服务,前端构建等。不少大型网站都是使用 Node.js 作为后台开发语言的,用的最多的就是使用Node.js做前端渲染和架构优化,比如 淘宝 双十一、去哪儿网 的 PC 端核心业务等。另外, Node.js 编写的包管理器 npm 已成为开源包管理了领域最好的生态,直接到2017年10月份,有模块超过47万,每周下载量超过32亿次,每个月有超过700万开发者使用npm。   

       而我们将要使用的formidable模块实现了上传和编码图片和视频。它支持GB级上传数据处理,支持多种客户端数据提交。有极高的测试覆盖率,非常适合在生产环境中使用。

       相信现在很多小伙伴在使用node来搭建后台,那么前后台对接少不了的就是图片和文字的上传,下面我将通过这篇文章来对图片文字同时上传问题进行详细的介绍:

安装formidable:

 

这是一个低版本的包,如果在开发中使用高版本的框架(如Express),formidable模块已经包含在框架中。具体用法参考:express-formidable.

通过npm安装:

npm install formidable@latest

这个教程主要是介绍我们使用formidable完成图片和文字同时上传的,所以项目目录结构就先不放出了(项目目录相对简单微笑),项目后台是用express框架,使用了Router的功能。

var express = require('express');
var router = express.Router();
var formidable = require("formidable"); //载入 formidable
 
router.post("/update_user*", function (req, res) {   //获取前端的异步请求
    var form_update = new formidable.IncomingForm(); //创建上传表单  
    form_update.encoding = 'utf-8'; //设置编码格式
    form_update.uploadDir = './pages/tmp'; //文件上传,设置临时上传目录  
    form_update.keepExtensions = true; //保留后缀  
    form_update.maxFieldsSize = 20 * 1024 * 1024;   //文件大小 k  
    form_update.parse(req, function(err, fields, files) {
        var Price = fields.Price; //获取前端传过来的数据

/*此处可提取更多我们的fields数据(前端表单中发送的字符串行)做一些我们自己的处理,譬如数据库操作*/

        var filesTmp = JSON.stringify(files,null,2);//将我们图片JavaScript的值转化为的json字符串
        if(err){
            console.log('parse error: ' + err);
        } else {
            console.log('parse files: ' + filesTmp);

            var uploadedPath = files.inputFile.path;

            var dstPath = './pages/image/' +fields.Field+"/"+fields.ClassId+"/"+Price+".jpg";  //fields.Field是前端表单中传过来的数据,建议先定义变量再拼接字符串
            //重命名为真实文件名
            fs.rename(uploadedPath, dstPath, function(err) {
                if(err){
                    console.log('rename error: ' + err);
                } else {
                    console.log('rename ok');
                }
            });
        }
    });
});
module.exports(router);

还得记得将我们这里的路由配置挂载到对应的启动文件中哦!

然后,我们可以在前台创建表单来提交请求了:

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值