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());
    });
    
  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/jkko123/p/10293424.html
Copyright © 2011-2022 走看看