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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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
目录
相关文章
|
3月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
3月前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
3月前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
165 1
|
3月前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
93 0
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
4月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
4月前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用
|
3月前
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。
|
4月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
113 1
|
4月前
|
JSON JavaScript 前端开发
Node.js Express 框架
10月更文挑战第7天
46 2

热门文章

最新文章