Javascript 如何正确使用express fileupload

Javascript 如何正确使用express fileupload,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试集成express fileupload以将图像上传到我的服务器。我遵循了此链接中提供的示例,但它不起作用。下面我只包含了与相关代码行相关的每个文件 index.ejs:相关行 <form method="post" action="/images" enctype="multipart/formdata"> <div class="panel-body form-horizontal&qu

我正在尝试集成
express fileupload
以将图像上传到我的服务器。我遵循了此链接中提供的示例,但它不起作用。下面我只包含了与相关代码行相关的每个文件

index.ejs:相关行

<form method="post" action="/images" enctype="multipart/formdata">
    <div class="panel-body form-horizontal">
        <div class="form-group col-md-12">
            <label class="col-sm-2 control-label" for="file">Browse:</label>

            <div class="col-md-10">
                <input class="form-control" type="file" name="file" id="file">
            </div>
        </div>
    </div>
</form>
configure.js

const express = require('express');
const config = require('./server/configure');
let app = new express();

app.set('port', process.env.PORT || 3300);

app = config(app);

app.listen(app.get('port'), () => {
    console.log(`Server up: http://localhost:${app.get('port')}`);
});
const express = require('express');
const path = require('path');
const expressFileUpload = require('express-fileupload');
const routes = require('./routes');

module.exports = (app) => {

    // applying expressFileUpload middleware
    app.use(expressFileUpload());

    routes(app);

    app.use('/public/', express.static(path.join(__dirname, '../public')));
    return app;
};
const image = require('../controllers/image');

module.exports = (app) => {
    app.post('/images', image.create);
};
module.exports = {

    create(req, res) {
        let image = req.files.file;
    }
}
routes.js

const express = require('express');
const config = require('./server/configure');
let app = new express();

app.set('port', process.env.PORT || 3300);

app = config(app);

app.listen(app.get('port'), () => {
    console.log(`Server up: http://localhost:${app.get('port')}`);
});
const express = require('express');
const path = require('path');
const expressFileUpload = require('express-fileupload');
const routes = require('./routes');

module.exports = (app) => {

    // applying expressFileUpload middleware
    app.use(expressFileUpload());

    routes(app);

    app.use('/public/', express.static(path.join(__dirname, '../public')));
    return app;
};
const image = require('../controllers/image');

module.exports = (app) => {
    app.post('/images', image.create);
};
module.exports = {

    create(req, res) {
        let image = req.files.file;
    }
}
image.js

const express = require('express');
const config = require('./server/configure');
let app = new express();

app.set('port', process.env.PORT || 3300);

app = config(app);

app.listen(app.get('port'), () => {
    console.log(`Server up: http://localhost:${app.get('port')}`);
});
const express = require('express');
const path = require('path');
const expressFileUpload = require('express-fileupload');
const routes = require('./routes');

module.exports = (app) => {

    // applying expressFileUpload middleware
    app.use(expressFileUpload());

    routes(app);

    app.use('/public/', express.static(path.join(__dirname, '../public')));
    return app;
};
const image = require('../controllers/image');

module.exports = (app) => {
    app.post('/images', image.create);
};
module.exports = {

    create(req, res) {
        let image = req.files.file;
    }
}
错误

我在下面一行得到一个错误
let image=req.files.file哪些状态

TypeError:无法读取未定义的属性“文件”


为什么文件未定义?如何使用express fileunload正确上载图像?

节点js代码中没有问题。它工作正常。问题在HTML文件中

表单enctype必须是enctype=“多部分/表单数据”&而不是您添加的内容

以下是参考资料:

在使用文件上载和express时,我建议您使用

文件上传很棘手

当一个或多个文件“到达”服务器时,您可以使用两种不同的方法存储它们:

  • 将文件保存到已知安全位置的磁盘
  • 将文件保存在RAM内存中
  • 这两种方法各有利弊。由你决定哪一个更适合你的需要

    下面是我的服务器上的一个示例,用于处理用户配置文件映像的上载(GitHub项目链接:)。它是用typescript编写的,但语法几乎相同

    文件中间件-FileMiddleware.ts

    const express = require('express');
    const config = require('./server/configure');
    let app = new express();
    
    app.set('port', process.env.PORT || 3300);
    
    app = config(app);
    
    app.listen(app.get('port'), () => {
        console.log(`Server up: http://localhost:${app.get('port')}`);
    });
    
    const express = require('express');
    const path = require('path');
    const expressFileUpload = require('express-fileupload');
    const routes = require('./routes');
    
    module.exports = (app) => {
    
        // applying expressFileUpload middleware
        app.use(expressFileUpload());
    
        routes(app);
    
        app.use('/public/', express.static(path.join(__dirname, '../public')));
        return app;
    };
    
    const image = require('../controllers/image');
    
    module.exports = (app) => {
        app.post('/images', image.create);
    };
    
    module.exports = {
    
        create(req, res) {
            let image = req.files.file;
        }
    }
    
    用于处理磁盘和内存存储的中间件。我可以选择哪一条最适合特定的快速路线(中间件下的示例)

    从“路径”导入路径;
    从“multer”进口multer;
    导出默认类FileMiddleware{
    公共静态只读memoryLoader=multer({
    存储:multer.memoryStorage(),
    限制:{
    文件大小:2097152,//2 MB
    },
    });
    公共静态只读diskLoader=multer({
    存储:multer.diskStorage({
    目的地:(_请求,_文件,cb)=>{
    cb(null,path.join(_dirname,'../tmp/upload');
    },
    }),
    限制:{
    文件大小:67108864,//64 MB
    },
    });
    }
    
    用户路由-User.ts

    const express = require('express');
    const config = require('./server/configure');
    let app = new express();
    
    app.set('port', process.env.PORT || 3300);
    
    app = config(app);
    
    app.listen(app.get('port'), () => {
        console.log(`Server up: http://localhost:${app.get('port')}`);
    });
    
    const express = require('express');
    const path = require('path');
    const expressFileUpload = require('express-fileupload');
    const routes = require('./routes');
    
    module.exports = (app) => {
    
        // applying expressFileUpload middleware
        app.use(expressFileUpload());
    
        routes(app);
    
        app.use('/public/', express.static(path.join(__dirname, '../public')));
        return app;
    };
    
    const image = require('../controllers/image');
    
    module.exports = (app) => {
        app.post('/images', image.create);
    };
    
    module.exports = {
    
        create(req, res) {
            let image = req.files.file;
        }
    }
    
    用于处理化身文件上载的用户路由。您可以看到,我正在定义路径、文件中间件(在本例中是一个内存存储—由映像键标识的单个文件)以及用于处理该过程的控制器

    从“express”导入{Router};
    从'@app/controller'导入{UserController};
    从'@app/middleware'导入{FileMiddleware};
    常量路由器=路由器();
    转发器(
    “/user/avatar”,
    FileMiddleware.memoryLoader.single('image'),
    UserController.updateAvatar
    );
    导出默认路由器;
    
    在控制器中,您可以使用req.file检索图像,就这么简单

    正如我所说的使用Multer,配置和使用非常简单和直观

    PS:记住,在表单中使用文件上载意味着添加enctype=“multipart/form data”