NodeJS Multer 不工作

Posted

技术标签:

【中文标题】NodeJS Multer 不工作【英文标题】:NodeJS Multer is not working 【发布时间】:2015-06-12 00:07:36 【问题描述】:

我尝试使用 NodeJS + ExpressJS + Multer 上传文件,但效果不佳。

我的 ExpressJS 版本是 4.12.3

这是我的来源

server.js:

var express = require('express'),
    multer  = require('multer');

var app = express();
app.use(express.static(__dirname + '/public'));
app.use(multer( dest: './uploads/'));

app.post('/', function(req, res)
    console.log(req.body); // form fields
    console.log(req.files); // form files
    res.status(204).end()
);
app.get('/', function(req, res)  
    res.sendFile('public/index.html');
);

app.listen(5000, function() 
    console.log("start 5000");
);

公共/index.html:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form method="post" enctype="multipart/form-data">
        <input id="file" type="file"/>
        <button type="submit">test</button>
    </form>
</body>
</html>

单击提交按钮时我的 NodeJS 控制台日志:

"C:\Program Files\nodejs\node.exe" server.js
start 5000

在 NodeJS 控制台上,req.files 中有空对象 我的来源有问题吗?

【问题讨论】:

表单是否真的到达了端点? app.post('/', function(req, res)? 您的文件输入没有name 属性,而且您仍然需要body-parser 才能获得req.body @RichardMacarhy 是的。这是正确的。 @BenFortune 抱歉,这是我来源的一部分。我复制到我的项目以供提问。也许是我的错误。任何 multer 都不能很好地工作。 @DingGGu 我的意思是输入 require name 属性。 【参考方案1】:

我没有看到您在单击提交按钮时调用任何 API 来上传文件。让我给你更全面的实现。

app.js 中配置

app.use(multer( 
    dest: './uploads/',
    rename: function (fieldname, filename) 
        return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
    ,
    onFileUploadStart: function (file) 
        console.log(file.fieldname + ' is starting ...')
    ,
    onFileUploadData: function (file, data) 
        console.log(data.length + ' of ' + file.fieldname + ' arrived')
    ,
    onFileUploadComplete: function (file) 
        console.log(file.fieldname + ' uploaded to  ' + file.path)
    
));

查看

<form id="uploadProfilePicForm" enctype="multipart/form-data" action="/user/profile_pic_upload" method="post">
          <input type="file" multiple="multiple" id="userPhotoInput" name="userPhoto"  accept="image/*" />
          <input type="submit" name="submit" value="Upload">
</form> 

端点'/user/profile_pic_upload' POST 在控制器中调用uploadProfilePic

var control = require('../controllers/controller');
app.post('/user/profile_pic_upload',control.uploadProfilePic);

在用户控制器中上传配置文件图片逻辑

uploadProfilePic = function(req,res)
    // get the temporary location of the file
    var tmp_path = req.files.userPhoto.path;
    // set where the file should actually exists 
    var target_path = '/Users/narendra/Documents/Workspaces/NodeExpressWorkspace/MongoExpressUploads/profile_pic/' + req.files.userPhoto.name;
    // move the file from the temporary location to the intended location
    fs.rename(tmp_path, target_path, function(err) 
        if (err) throw err;
        // delete the temporary file, so that the explicitly set temporary upload dir does not get filled with unwanted files
        fs.unlink(tmp_path, function() 
            if (err) 
                throw err;
            else
                    var profile_pic = req.files.userPhoto.name;
                    //use profile_pic to do other stuffs like update DB or write rendering logic here.
             ;
            );
        );
;

【讨论】:

自述文件github.com/expressjs/multer 上的每个文档我不相信其中任何一个(在 dest 之外)是当前的 multer 选项 @lfender6445 是的,你是对的。我花了大约一个小时试图弄清楚为什么没有调用 onFile* 函数。 它给出错误:app.use() requires a middleware function 对不起,这是我的错误。找到解决方案。我使用res 而不是filefunction(req, res,......)【参考方案2】:

试试这个

var multer = require('multer')

var storage = multer.diskStorage(
    destination: function (request, file, callback) 
        callback(null, './uploads/');
    ,
    filename: function (request, file, callback) 
        console.log(file);
        callback(null, file.originalname)
    
);

var upload = multer( storage: storage );

app.post('/', upload.single('photo'), function (req, res) 

    console.log(req.body) // form fields
    console.log(req.file) // form files
    res.status(204).end()
);

参考: http://wiki.workassis.com/nodejs-express-get-post-multipart-request-handling-example/

【讨论】:

这个最适合我,谢谢我的英雄

以上是关于NodeJS Multer 不工作的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs如何将Multer Buffer保存到系统上的文件中

如何在nodejs的控制器内调用multer中间件?

nodejs + multer + angularjs 无需重定向即可上传

如何在 NodeJS 中保存和显示使用 Multer 包保存的图片?

nodejs Multer中间件

Nodejs进阶:基于express+multer的文件上传