zoukankan      html  css  js  c++  java
  • node.js中 express + multer 处理文件上传

    multer中间件,可以很方便的结合express处理用户表单上传的文件。

    一、安装multer

    npm install multer
    

      

    二、处理单个文件上传

    const express = require('express');
    const multer = require('multer');
    const path = require('path');
    
    let app = express();
    app.listen(8888);
    
    app.get('/', function (req, res) {
        res.sendFile(path.join(__dirname, 'index.html'));
    });
    
    //创建一个multer对象,dest用来设置上传文件存放的目录
    let upload = multer({dest: 'uploads/'});
    //single()方法是用来处理单个文件上传,注意参数的名字要与表单中的name值一致
    app.post('/upload', upload.single('img'), function (req, res) {
        //body里面存放了表单的文本域信息
        console.log(req.body);
        //file存放了单个文件的信息
        console.log(req.file);
    
        res.end('ok');
    });
    

    index.html的代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>表单</title>
    </head>
    <body>
    <form action="http://localhost:8888/upload" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="name"><br>
        密码:<input type="password" name="pwd"><br>
        图片:<input type="file" name="img"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    点击提交后,可以看到在upload目录下有一个文件生成了,这个文件就是我们上传的文件,不过好像扩展名没有了。

    二、处理多个文件上传

    处理多个文件上传,可以使用 array() 或 fields() 方法。

    const express = require('express');
    const multer = require('multer');
    const path = require('path');
    
    let app = express();
    app.listen(8888);
    
    app.get('/', function (req, res) {
        res.sendFile(path.join(__dirname, 'index.html'));
    });
    
    
    let upload = multer({dest: 'uploads/'});
    //array()方法用于处理多个文件上传
    //参数一表示,文件上传表单name属性的值
    //参数二表示,允许上传文件个数
    app.post('/uploads', upload.array('imgs', 3), function (req, res) {
        //files存放了多个文件的信息,是一个数组
        console.log(req.files);
        res.end('ok');
    });
    
    //fields()方法也可以处理多个文件,参数是一个对象数组。
    //对象中用name指定文件上传表单name属性的值,maxCount指定允许上传文件个数
    app.post('/objects', upload.fields([
        {name: "head", maxCount: 1},
        {name: "info", maxCount: 3}
    ]), function (req, res) {
        //files是一个对象,键就是我们上面设置的name的值,值就是文件数组
        console.log(req.files);
        res.end('ok');
    });
    

    index.html的代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>表单</title>
    </head>
    <body>
    <form action="http://localhost:8888/uploads" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="name"><br>
        密码:<input type="password" name="pwd"><br>
        图片1:<input type="file" name="imgs"><br>
        图片2:<input type="file" name="imgs"><br>
        图片3:<input type="file" name="imgs"><br>
        <input type="submit" value="提交">
    </form>
    
    <form action="http://localhost:8888/objects" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="name"><br>
        密码:<input type="password" name="pwd"><br>
        头像:<input type="file" name="head"><br>
        信息1:<input type="file" name="info"><br>
        信息2:<input type="file" name="info"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

      

     三、自定义文件存储路径和文件名

    上面的代码我们通过配置 dest 来指定存放目录。不过如果上传文件过多,单一的存放在一个目录下肯定有问题,所以需要我们自定义。

    还有文件上传后,都没有扩展名了,这显然也需要我们自定义。

    const express = require('express');
    const multer = require('multer');
    const path = require('path');
    const fs = require('fs');
    
    let app = express();
    app.listen(8888);
    
    app.get('/', function (req, res) {
        res.sendFile(path.join(__dirname, 'index.html'));
    });
    
    
    let upload = multer({
        storage: multer.diskStorage({
            //设置文件存储位置
            destination: function (req, file, cb) {
                let date = new Date();
                let year = date.getFullYear();
                let month = (date.getMonth() + 1).toString().padStart(2, '0');
                let day = date.getDate();
                let dir = "./uploads/" + year + month + day;
    
                //判断目录是否存在,没有则创建
                if (!fs.existsSync(dir)) {
                    fs.mkdirSync(dir, {recursive: true});
                }
    
                //dir就是上传文件存放的目录
                cb(null, dir);
            },
            //设置文件名称
            filename: function (req, file, cb) {
                let fileName = file.fieldname + '-' + Date.now() + path.extname(file.originalname);
                //fileName就是上传文件的文件名
                cb(null, fileName);
            }
        })
    });
    
    app.post('/uploads', upload.array('imgs', 3), function (req, res) {
        console.log(req.files);
        res.end('ok');
    });
    

      

    四、过滤上传文件

    有些时候我们希望用户上传的只是图片文件,其他文件不让上传。

    const express = require('express');
    const multer = require('multer');
    const path = require('path');
    const fs = require('fs');
    
    let app = express();
    app.listen(8888);
    
    app.get('/', function (req, res) {
        res.sendFile(path.join(__dirname, 'index.html'));
    });
    
    let upload = multer({
        //用于过滤文件的函数
        fileFilter: function (req, file, cb) {
            let ext = path.extname(file.originalname);
            let extArr = ['.jpg', '.jpeg', '.gif', '.png'];
            if (!extArr.includes(ext)) {
                //拒绝这个文件
                //cb(null, false);
                //当然我们还可以发送一个错误
                cb(new Error('扩展名不正确'));
            }
    
            //接受这个文件
            cb(null, true);
        }
    });
    
    app.post('/uploads', upload.array('imgs', 3), function (req, res) {
        console.log(req.files);
        res.end('ok');
    });
    
    //捕获错误
    app.use(function (err, req, res, next) {
        res.send(err.toString());
    });
    
  • 相关阅读:
    【css】容器撑满浏览器--- height:100%
    【实践】js六道有趣的题
    【Canvas】树冠
    asp.net上传Excel文件到服务端进行读取
    HttpContext.Current多线程调用
    abstract修饰符,具体类与抽象类的区别
    如何快速恢复MyEclipse的默认主题
    日历源代码
    for语句应用:乘法表
    Java的优先级
  • 原文地址:https://www.cnblogs.com/jkko123/p/10293424.html
Copyright © 2011-2022 走看看