本文介绍formidable模块:保留上传的文件的扩展名问题

当前下载的版本为 "formidable": "^2.0.1"

结合FormData对象的使用

前端代码:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文件上传</title>
    <style>
        .contarner {
            margin: 100px 100px;
        }
        .form-group input {
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <div class="contarner">
        <div class="form-group">
            <label>请选择文件</label><br>
            <input type="file" id="file">
        </div>
    </div>
    <script>
        var file = document.querySelector('#file');
        file.onchange = function () {
            var formData = new FormData();
            formData.append('attrName', this.files[0]);
            var xhr = new XMLHttpRequest();
            xhr.open('post', 'http://localhost:3000/loadPlus');
            xhr.send(formData);
            xhr.onload = function () {
                if (xhr.status == 200) {
                    console.log(xhr.responseText);
                }
            }
        }
    </script>
</body>

</html>

服务器端代码:

// 引入express框架
const express = require('express');
//路径处理模块
const path = require('path');
//引入formidable模块
const formidable = require('formidable');
//第三种写法需要引入这个
const { IncomingForm } = require('formidable');
//创建web服务器
const app = express();

// app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 静态资源访问 public
app.use(express.static(path.join(__dirname, 'public')));

//创建路由
app.get('/', (req, res) => {
    res.send('hello Ajax');
})
//01原来写法
app.post('/load', (req, res) => {
    // 创建formidable表单解析对象
    const form = new formidable.IncomingForm();
    //解析客户端传过来的FormData对象
    //设置上传文件的保存路径
    form.uploadDir = path.join(__dirname, 'public', 'uploads');
    //保留原来文件扩展名   这边测试并没有生效
    form.keepExtensions = true;
    form.parse(req, (err, fields, files) => {
        res.send('ok');
    })
})
//02第二种写法
app.post('/upload', (req, res) => {
    // 创建formidable表单解析对象
    const form = formidable({ multiples: true, uploadDir: path.join(__dirname, 'public', 'uploads'), keepExtensions: true })
    //解析客户端传过来的FormData对象
    form.parse(req, (err, fields, files) => {
        res.send('ok');
    })
})
//03第三种写法
app.post('/loadPlus', (req, res) => {
    //解析客户端传过来的FormData对象
    const form = new IncomingForm({ multiples: true, uploadDir: path.join(__dirname, 'public', 'uploads'), keepExtensions: true });
    form.parse(req, (err, fields, files) => {
        res.send('ok');
    })
})
//监听端口
app.listen(3000);
console.log('服务器启动成功');

关于这个版本的formidable,有个问题:在使用原来写法时,form.keepExtensions = true; 这条指令并没有生效,在上传文件后并不能保留原来的扩展名。亦或是我代码写得有问题,若有发现问题,还请各位大佬不吝赐教。

第二种和第三种写法上传文件后都可正常保留原来文件的扩展名(后缀名)

如果本文对你有帮助,还请给小子点个赞哈,您的支持是我创作的动力!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐