node+express+mysql实现服务端文件上传功能

前言

由于是新手,花费了不少时间,现在走通没有问题,所以要是大佬路过,请多多指导,本文主要对初入node不久的新手准备的,如有问题,欢迎留言互相学习

首先通过 express 起服务

//server.js
const express=require('express');
const static=require('express-static');
const bodyParser=require('body-parser');
const multer=require('multer');
const multerObj=multer({dest: './static/upload'});
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');
const consolidate=require('consolidate');
var server=express();
server.listen(8090);
//1.获取请求数据
//get自带
server.use(bodyParser.urlencoded());
server.use(multerObj.any());
//cors跨域设置
server.all('*',function (req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
  res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
  if (req.method == 'OPTIONS') {
    res.send(200); //让options请求快速返回/
  }
  else {
    next();
  }
});
//2.route
server.use('/upToImg1/', require('./route/upToImg1')());
//3.default:static
server.use('/',static('./static'));
server.use('/files',static('./static'));

安装需要的插件或三方中间件,本文是结合 mysql 数据库实现文件上传,所以得提前配好mysql并通过 npm install mysql 进行安装

注意:大家看到上面的multer插件了吧,这个插件就是控制文件上传的,dest配置上传路径,我这里图方便就在全局使用上传功能(.any())了,这样会导致有恶意传送文件到其它路由的情况,所以建议大家最好把此插件写到特定路由以使用
这里贴一张multer的使用方法:
在这里插入图片描述

//package.json
{
  "devDependencies": {
    "body-parser": "^1.17.1",
    "consolidate": "^0.14.5",
    "cookie-parser": "^1.4.3",
    "cookie-session": "^2.0.0-beta.1",
    "debug": "^2.6.6",
    "ejs": "^2.5.6",
    "express": "^4.15.2",
    "express-route": "^0.1.4",
    "express-static": "^1.1.0",
    "multer": "^1.3.0",
    "mysql": "^2.13.0"
  }
}

接下来就是业务逻辑部分了,配置路由,结合上面路由的注册,新建路由js文件
路由文件

  • sql 文件如下
    sql文件
  • index.js 所有代码如下
    const express = require("express");
    const mysql = require("mysql");
    //mysql数据库配置,必须同后台数据库配置相同,包括密码数据库名等
    var db = mysql.createPool({
      host: "localhost",
      user: "root",
      password: "password",
      database: "test"
    });
    const pathLib = require("path");
    const fs = require("fs");
    module.exports = function() {
      var router = express.Router();
      //get请求获取数据库数据 获取参数,如果是传递的是del和id,则根据id删除数据库相应id的数据,并通过文件名和路径删除存到upload文件夹下面的对应文件
      //如果传递mod和id,则根据id返回相应id的数据
      //如果不传递,则为默认default,返回所有数据
      router.get("/", function(req, res) {
        switch (req.query.act) {
          case "del":
            db.query(
              `SELECT * FROM uptoimg_table WHERE ID=${req.query.id}`,
              (err, data) => {
                if (err) {
                  console.error(err);
                  res.status(500).send("database error").end();
                } else {
                  if (data.length == 0) {
                    res.status(404).send("no this uptoimg").end();
                  } else {
                    fs.unlink("static/upload/" + data[0].src, err => {
                      if (err) {
                        console.error(err);
                        res.status(500).send("file opration error").end();
                      } else {
                        db.query(
                          `DELETE FROM uptoimg_table WHERE ID=${req.query.id}`,
                          (err, data) => {
                            if (err) {
                              console.error(err);
                              res.status(500).send("database error").end();
                            } else {
                              res.send({ data: data, type: "del" });
                            }
                          }
                        );
                      }
                    });
                  }
                }
              }
            );
            break;
          case "mod":
            db.query(
              `SELECT * FROM uptoimg_table WHERE ID=${req.query.id}`,
              (err, data) => {
                if (err) {
                  console.error(err);
                  res.status(500).send("database error").end();
                } else if (data.length == 0) {
                  res.status(404).send("no this evaluation").end();
                } else {
                  db.query(`SELECT * FROM uptoimg_table`, (err, evaluations) => {
                    if (err) {
                      console.error(err);
                      req.status(500).send("database error").end();
                    } else {
                      res.send({ data: evaluations, type: "mode" });
                    }
                  });
                }
              }
            );
            break;
          default:
            db.query(`SELECT * FROM uptoimg_table`, (err, evaluations) => {
              if (err) {
                console.error(err);
                req.status(500).send("database error").end();
              } else {
                res.send({ data: evaluations, type: "default" });
              }
            });
        }
      });
      //*******************************分割线*****************************************
      //以下为post请求,包含增删改等操作
      router.post("/", function(req, res) {
        var name = req.body.name;
        var content = req.body.content;
        //如果有文件上传,则对文件名进行处理,如果没有文件上传,也就是newFileName为null,则只允许
        //对除了图片的数据进行操作
        if (req.files.length > 0) {
          var ext = pathLib.parse(req.files[0].originalname).ext;
          var oldPath = req.files[0].path;
          var newPath = req.files[0].path + ext;
          var newFileName = req.files[0].filename + ext;
        } else {
          var newFileName = null;
        }
        if (newFileName) {
          fs.rename(oldPath, newPath, err => {
            if (err) {
              console.error(err);
              res.status(500).send("file opration error").end();
            } else {
              if (req.body.mod_id) {
                //修改
                //先删除老的,再添加新的
                db.query(
                  `SELECT * FROM uptoimg_table WHERE ID=${req.body.mod_id}`,
                  (err, data) => {
                    if (err) {
                      console.error(err);
                      res.status(500).send("database error").end();
                    } else if (data.length == 0) {
                      res.status(404).send("old file not found").end();
                    } else {
                      fs.unlink("static/upload/" + data[0].src, err => {
                        if (err) {
                          console.error(err);
                          res.status(500).send("file opration error").end();
                        } else {
                          db.query(
                            `UPDATE uptoimg_table SET \
                          name='${name}', content='${content}', \
                          src='${newFileName}' \
                          WHERE ID=${req.body.mod_id}`,
                            err => {
                              if (err) {
                                console.error(err);
                                res.status(500).send("database error").end();
                              } else {
                                res.send({ type: "changeSuccess" });
                              }
                            }
                          );
                        }
                      });
                    }
                  }
                );
              } else {
                //添加
                db.query(
                  `INSERT INTO uptoimg_table \
                (name, content, src)
                VALUES('${name}', '${content}', '${newFileName}')`,
                  (err, data) => {
                    if (err) {
                      console.error(err);
                      res.status(500).send("database error").end();
                    } else {
                      res.send({ data: data, type: "add" });
                    }
                  }
                );
              }
            }
          });
        } else {
          if (req.body.mod_id) {
            //修改
            //直接改
            db.query(
              `UPDATE uptoimg_table SET \
              name='${name}', content='${content}' \
              WHERE ID=${req.body.mod_id}`,
              err => {
                if (err) {
                  console.error(err);
                  res.status(500).send("database error").end();
                } else {
                  res.send({ data: "data修改成功", type: "change" });
                }
              }
            );
          } else {
            //添加
            db.query(
              `INSERT INTO uptoimg_table \
            (name, content, src)
            VALUES('${name}', '${content}', '${newFileName}')`,
              (err, data) => {
                if (err) {
                  console.error(err);
                  res.status(500).send("database error").end();
                } else {
                  res.send({ data: data, type: "add" });
                }
              }
            );
          }
        }
      });
      return router;
    };
    

到这里就基本大功告成了,启动 server.js 文件,关联数据库,就可以操作文件了,前端相关代码我用原生js写的,在我博客的另一篇,如有需要可进行查看

  • 上传成功的图片会在upload文件夹更新
    在这里插入图片描述
  • 数据库数据也会得到更新
    在这里插入图片描述

新手笔记,如有疑问欢迎交流


文章作者: qiangqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 qiangqiang !
评论
 上一篇
原生js文件上传,input如何实现文件(图片)上传与预览 原生js文件上传,input如何实现文件(图片)上传与预览
效果 说明 首先文件上传得需要后台支持,我这里用的node写的后端服务,篇幅有限,这里就不贴后端代码了,有需要的留言联系 dom部分 由于form表单自动关联input文件上传按钮,故点击上传文件按钮时会自动往 action 路径提交文件
2019-05-31
下一篇 
vs-code中用liveServer打开vue-cli打包后的html,模拟查看线上路径问题 vs-code中用liveServer打开vue-cli打包后的html,模拟查看线上路径问题
首先在扩展搜索liveServer下载安装之后右键html就会出现liveServer命令我用的vue-cli版本是3.2,为防止路径问题,在vue.config.js中修改publicPath为 module.exports = {
2019-05-13
  目录