multer实现图片上传

multer实现图片上传:

ejs代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>图片上传</title>
</head>

<body>
    <!-- 
        在终端安装:cnpm install multer
        Multer是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件。该中间件不处理multipart/form-data数据格式以外的任何形式的数据

     -->
    <!-- 单张上传 -->
    <h3>单张上传</h3>
    <form action="/uploadImg/addimg" method="post" enctype="multipart/form-data">
        <input type="file" name="img" id="img1">
        <input type="submit" value="提交">
    </form>

    <!-- 多张上传 -->
    <h3>多张上传</h3>
    <form action="/uploadImg/addimgs" method="post" enctype="multipart/form-data">
        <input type="file" name="imgs" multiple id="img2">
        <input type="submit" value="提交">
    </form>

    <!-- ajax单张上传图片 -->
    <h3>ajax单张上传图片</h3>
    <input type="file" name="ajaximg" id="ajaximg">
    <input type="submit" value="提交" id="ajaxbtn">

    <!-- ajax多张上传图片 -->
    <h3>ajax多张上传图片</h3>
    <input type="file" name="ajaximg" multiple id="ajaximgs">
    <input type="submit" value="提交" id="ajaxbtns">
</body>
<script src="web/js/jquery-1.10.1.min.js"></script>
<script>
    // ajax单张上传
    $("#ajaxbtn").click(function (e) {
        // console.log($("#ajaximgs")[0].file[0])
        let file = $("#ajaximg")[0].files[0];
        let formdata = new FormData();
        formdata.append("img", file);
        // ajax单张上传                      
        $.ajax({
            type: "POST",//默认post
            url: "/uploadImg/addimg",//默认当前页
            data: formdata,//格式(key:value)
            contentType: false,
            processData: false,
            dataType: "json",
            beforeSend: function () { },//请求发送当前回调,常用验证
            success: function (response) {//请求成功回调
                alert("上传成功");
            },
            error: function (e) {
                if (e.statusText == "timeout") {
                    alert("请求成功");

                }
            },
            // 请求成功与否都会执行的回调
            complete: function () { }
        });
    });

    // ajax多张上传
    $("#ajaxbtns").click(function (e) {
        //  console.log($("#ajaximgs")[0].files)
        let files = $("#ajaximgs")[0].files;
        let formdata = new FormData();
        for (const file of files) {
            formdata.append("imgs", file);
        }
        // ajax单张上传
        $.ajax({
            type: "POST",//默认post
            url: "/uploadImg/addimgs",//默认当前页
            data: formdata,//格式(key:value)
            contentType: false,
            processData: false,
            dataType: "json",
            beforeSend: function () { },//请求发送当前回调,常用验证
            success: function (response) {//请求成功回调
                alert("上传成功");
            },
            error: function (e) {
                if (e.statusText == "timeout") {
                    alert("请求成功");

                }
            },
            // 请求成功与否都会执行的回调
            complete: function () { }
        });
    });
</script>

</html>

服务器代码:

// 引入模块
var express = require('express');
var fs = require("fs");
var router = express.Router();
var multer = require("multer");
// 设置上传图片的文件夹
var upload = multer({ dest: "public/uploads/" });

/* GET home page. */
router.get('/', function (req, res, next) {
    res.render("phone/uploadImg");
});
// .single(fieldname)
// 该方法接收单个上传的文件 fieldname为上传文件所用的标签name属性。上传的文件信息存储在req.file中
// 单张上传
router.post('/addimg', upload.single("img"), function (req, res) {
    let file = req.file;
    // fieldname: 上传文件标签在表单中的name
    let filename = "public/uploads/" + file.filename;
    // 判断上传的图片格式
    // mimetype:该文件的Mime type
    if (file.mimetype == "image/jpeg") {
        filename += ".jpg";
    }
    if (file.mimetype == "image/png") {
        filename += ".png";
    }
    if (file.mimetype == "image/gif") {
        filename += ".gif";
    }
    fs.renameSync(file.path, filename);
    console.log(req.file);
    // 响应
    res.json("上传成功");
});

// 多张图片上传
router.post('/addimgs', upload.array("imgs"), function (req, res) {
    let files = req.files;
    
    for (let file of files) {
        // fieldname: 上传文件标签在表单中的name
        let filename = "public/uploads/" + file.filename;
        // 判断上传的图片格式
        // mimetype:该文件的Mime type
        if (file.mimetype == "image/jpeg") {
            filename += ".jpg";
        }
        if (file.mimetype == "image/png") {
            filename += ".png";
        }
        if (file.mimetype == "image/gif") {
            filename += ".gif";
        }
        fs.renameSync(file.path, filename);
    }
    console.log(req.file);
    // 响应
    res.json("上传成功");
});

module.exports = router;

路由接口:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
// 前端
// var indexRouter = require('./routes/index');
// var usersRouter = require('./routes/users');
// var IndexRouter = require('./routes/phone/index');
// var detailRouter = require('./routes/phone/detail');
// var newsShowRouter = require('./routes/phone/news-show');
// var newsRouter = require('./routes/phone/news');
// var otherListRouter = require('./routes/phone/other-list');
// var proListRouter = require('./routes/phone/pro-list');
// var tableRouter = require('./routes/phone/table');
var uploadImgRouter = require('./routes/phone/uploadImg');//图片上传路由

// 后台
var adminRouter = require('./routes/admin/index');
var adminMainRouter = require('./routes/admin/pages/main');
var adminDelRouter = require('./routes/admin/pages/article/del');
var adminIndexRouter = require('./routes/admin/pages/article/index');
var adminEditRouter = require('./routes/admin/pages/article/edit');



var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());


// 设置public为局部变量
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
// app.use('/users', usersRouter);
// app.use('/index', IndexRouter);
// app.use('/detail', detailRouter);
// app.use('/newsShow', newsShowRouter);
// app.use('/news', newsRouter);
// app.use('/other', otherListRouter);
// app.use('/pro', proListRouter);
// app.use('/table', tableRouter);
app.use('/uploadImg', uploadImgRouter);

// 后台
// app.use('/admins', adminRouter);
// app.use('/adminMain', adminMainRouter);
// app.use('/adminDel', adminDelRouter);
// app.use('/adminindex', adminIndexRouter);
// app.use('/adminEdit', adminEditRouter);


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

  

原文地址:https://www.cnblogs.com/xiaozhou223/p/11851172.html