11. 文件上传

2022-11-07 11:15:04发布
32

文件上传需要使用到第三方库multer,先安装

npm i multer -S


单文件上传例子

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8080/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name='pic'>
        <button type='submit'>提交</button>
    </form>
</body>
</html>

需要注意的是,enctype需要设置成"multipart/form-data"

node

const express = require('express');
const multer = require('multer'); // 引入
const fs = require('fs');

const server = express();
server.use(express.static('./www'));
console.log('server is runing...');
server.listen('8080');

const upload = multer({
    dest: './www/upload/' // 配置文件上传后的存放路径
}).single('pic'); // single 代表单文件上传,这里的pic需要和html的input的name的值一致

server.post('/upload', (req, res) => {
    upload(req, res, function (err) {
        if (err) {
            res.send(err);
        } else {
            const file = req.file;
            /**
             * file对象的属性如下
             * {
                    fieldname: 'pic', // 和html的input的name一致
                    originalname: '403.gif', // 文件原来的名字
                    encoding: '7bit',
                    mimetype: 'image/gif', // 文件类型
                    destination: './www/upload/', // 文件存放的路径
                    filename: '1c3de7bbf387daa9ab5019ebc67cd874', // 随机生成的字符串,这个字符串就是上传后的文件名字
                    path: 'wwwupload1c3de7bbf387daa9ab5019ebc67cd874', // 全路径
                    size: 164227 // 大小
                }
            */
            let oldFileName = file.destination + file.filename; // ./www/upload/1c3de7bbf387daa9ab5019ebc67cd874
            let newFileName = file.destination + file.filename + '-' + file.originalname; // ./www/upload/1c3de7bbf387daa9ab5019ebc67cd874-403.gif,需要注意的是这里不能直接用file.destination + file.originalname,不然下次再上传同一样名字的文件的话,旧的文件会被新的文件覆盖
            /**
             *  上传成功后重命名。
             *  因为上传文件成功后,如果不做任何处理,文件的名字默认是用filename来命名的。filename没有后缀名,所以需要使用renameSync函数来修改下文件名。给它加上后缀
             *  renameSync函数的作用是重命名。第一个参数是旧的名字,第二个参数是新的名字。比如fs.renameSync('aaa', 'bbb');的意思就是把aaa改成bbb。
             *  注意,renameSync是同步函数,它还有一个异步函数,叫rename。
             */
            fs.renameSync(oldFileName, newFileName);
            res.send('重命名文件成功!');
        }
    })
});


多文件上传

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8080/upload" method="POST" enctype="multipart/form-data">
        <input type="file" multiple name='pic'>
        <button type='submit'>提交</button>
    </form>
</body>
</html>

需要注意的是input需要增加multiple属性

node

const express = require('express');
const multer = require('multer');
const fs = require('fs');

const server = express();
server.use(express.static('./www'));
console.log('server is runing...');
server.listen('8080');

const upload = multer({
    dest: './www/upload/'
}).array('pic', 5);  // 这里改成array,5代表是最多只能一次性上传5个文件

server.post('/upload', (req, res) => {
    upload(req, res, function (err) {
        if (err) {
            res.send(err);
        } else {
            const files = req.files;  // 这里改成files
            for (let i = 0; i < files.length; i++) {
                const file = files[i];
                let oldFileName = file.destination + file.filename;
                let newFileName = file.destination + file.filename + '-' + file.originalname;
                fs.renameSync(oldFileName, newFileName);
            }
            res.send('重命名文件成功!');
        }
    })
});