node+express使用multiparty实现文件上传

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: node+express使用multiparty实现文件上传

文件上传在一个项目中是相对于比较基础的功能,今天分享一下自己是如何在nodejs中使用中间件multiparty实现文件上传的。nodejs环境的搭建就不赘述了,直奔主题吧!

第一步:引入express等需要用到的模块express,jade等模块都需要自己手动使用npm命令在控制台安装,如npm install express。在这里用的是jade模板引擎。

(文件 demo.js)

var express = require("express");//导入express模块
var path = require('path');//路径配置模块
var bodyParser = require('body-parser')//页面传递参数解析
var mysql = require('mysql');//mysql模块
var multiparty = require('multiparty');//文件上传模块
var util = require('util');
var fs = require('fs');
var app = express(); 
var port = 3000;//端口号
app.set("views","views/pages/");//设置视图文件路径
app.set("view engine","jade");//设置模板引擎
app.use(express.static(path.join(__dirname,'bower_components')))//设置静态文件路径
app.use(bodyParser.urlencoded({extended: true,}))
app.listen(port);//监听端口
console.log("start..."+port);
console.log('连接开始');
app.get("/index",function (req,res) {
  res.send("hello")
})

然后我们就可以在控制台启动服务 node demo,访问路径http://localhost:3000/index就可以看到结果了

开始编写html代码(因为使用的jade模板引擎,所以按照jade语法编写)主要是表单提交,关于样式代码就不解释了。代码和浏览器效果如下,其中代码有几个地方要解释一下,enctype="multipart/form-data"这一段代码必须要加上,用于表单里图片上传,action = "/demo"代表表单提交处理的路径。并把后台的get 请求代码附上

(文件demo.jade)

div.con
    form.loginForm(method = "post",enctype="multipart/form-data" ,action = '/demo')
      div.upload
        span 姓名:
          input.stuMsg.stu_name(type = "text",name = "name",placeholder = "姓名")
      div.upload      
        span 学号:
          input.stuMsg.stu_number(type = "text",name = "number",placeholder = "学号")
      div.upload
        span 性别:
          input.stuMsg.stu_sex(type = "text",name = "sex",placeholder = "性别")
      div.upload
        span 年龄:
          input.stuMsg.stu_age(type = "text",name = "age",placeholder = "年龄")
      div.upload#containimg
        span 头像:
          input.stuMsg.stu_img(type = "file",name = "upfiles",multiple='mutiple')   
      div.upload
        input.stuMsg.addmsg(type = "submit",value = "录入")

(文件app.js)

app.get("/demo",function (req,res) {
  res.render('demo',{})
})

接着开始连接数据库,我使用的市mysql,同样需要引入模块。数据库里面的字段有id name number sex age img

(文件demo.js)

//创建连接数据库
var conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    database:'stu_manage_system',
    port: 3306,
});
conn.connect();//连接数据库

然后开始编写文件上传的核心代码:

(文件demo.js)

app.post("/demo",function(req,res){
  var insertSQL = 'insert into student values(0,?,?,?,?,?)';
  var insertSQL_params = [];  
  var form = new multiparty.Form();//实例一个multiparty
    form.uploadDir = __dirname+"/bower_components/uploads/";//设置文件储存路径
    //开始解析前台传过来的文件
    form.parse(req, function(err, fields, files) {
      for (var item in fields){
        insertSQL_params.push(fields[item][0])
        console.log(fields[item][0])
      }
      var filesTmp = JSON.stringify(files);
        var pr = JSON.parse(filesTmp)
      console.log(pr.upfiles.length)
        if(err){
          console.log('parse error: ' + err);
        } else {
          for (var i = 0 ; i < pr.upfiles.length ; i++) {
            var inputFile = files.upfiles[i];//获取第一个文件
            var finalname = inputFile.originalFilename;
            insertSQL_params.push(finalname)
            var new_name =__dirname+"/bower_components/uploads/"+finalname;//获取文件名
            console.log(new_name)
            var old_name = inputFile.path;//获取文件路径
            console.log(old_name)
        fs.renameSync(old_name,new_name);                   
          }
      }
      //添加数据到数据库
      conn.query(insertSQL,insertSQL_params, function (err2, rows) {
      if (err2){
              console.log(err2);
          }else{
            console.log("成功")
          }
    })
        res.send("成功")            
  })
})

其中有些地方解释一下:

首先实例一个multiparty赋给form,

form.parse(req,callback)的回调函数三个参数,其中fields是一个对象,表示表单中非文件的数据

files参数也是一个对象,他包含了文件的所有信息

JSON.parse用于从一个字符串中解析出json对象JSON.stringify则相反

通过originalFilename获取文件的原始名,最后将文件信息存到数据库。

demo.jsd的完整代码如下

var express = require("express");//导入express模块
var path = require('path');//路径配置模块
var bodyParser = require('body-parser')//页面传递参数解析
var mysql = require('mysql');//mysql模块
var multiparty = require('multiparty');//文件上传模块
var util = require('util');
var fs = require('fs');
var app = express(); 
var port = 3000;//端口号
app.set("views","views/pages/");//设置视图文件路径
app.set("view engine","jade");//设置模板引擎
app.use(express.static(path.join(__dirname,'bower_components')))//设置静态文件路径
app.use(bodyParser.urlencoded({extended: true,}))
app.listen(port);//监听端口
console.log("start..."+port);
console.log('连接开始');
//创建连接数据库
var conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    database:'stu_manage_system',
    port: 3306,
});
conn.connect();//连接数据库 
app.get("/demo",function (req,res) {
  res.render('demo',{})
})
app.post("/demo",function(req,res){
  var insertSQL = 'insert into student values(0,?,?,?,?,?)';
  var insertSQL_params = [];  
  var form = new multiparty.Form();//实例一个multiparty
    form.uploadDir = __dirname+"/bower_components/uploads/";//设置文件储存路径
    //开始解析前台传过来的文件
    form.parse(req, function(err, fields, files) {
      console.log(fields)
      for (var item in fields){
        insertSQL_params.push(fields[item][0])
        console.log(fields[item][0])
      }
      console.log(files)
      var filesTmp = JSON.stringify(files);
        var pr = JSON.parse(filesTmp)
      console.log(pr.upfiles.length)
        if(err){
          console.log('parse error: ' + err);
        } else {
          for (var i = 0 ; i < pr.upfiles.length ; i++) {
            var inputFile = files.upfiles[i];//获取第一个文件
            var finalname = inputFile.originalFilename;
            insertSQL_params.push(finalname)
            var new_name =__dirname+"/bower_components/uploads/"+finalname;//获取文件名
            console.log(new_name)
            var old_name = inputFile.path;//获取文件路径
            console.log(old_name)
        fs.renameSync(old_name,new_name);                   
          }
      }
      //添加数据到数据库
      conn.query(insertSQL,insertSQL_params, function (err2, rows) {
      if (err2){
              console.log(err2);
          }else{
            console.log("成功")
          }
    })
        res.send("成功")            
  })
})

如有错误、意见、建议,欢迎提出。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
1月前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
63 1
|
1月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
1月前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
47 0
|
1月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
1月前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
32 2
2024年5月node.js安装(winmac系统)保姆级教程
|
1月前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
98 2
|
3月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
2月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
40 2
|
2月前
|
JavaScript 算法 内存技术
如何降低node.js版本(nvm下载安装与使用)
如何降低node.js版本(nvm下载安装与使用)