42

我刚刚开始学习 NodeJS,但遇到了一个问题。我想将文件上传到我的服务器。为此,我搜索并找到了这个模块multer。按照 GitHub 上的示例进行操作:

var express = require('express');
var multer = require('multer');
var upload = multer({ dest: 'uploads/' });

var app = express()

app.post('/uploadImage', upload.single('image'), function(req, res) {
    console.log(req.file);
});

在将带有 FormData 的图像发布到图像时,/uploadImage该图像将保存在uploads/目录中。问题是图像以一个奇怪的名称保存,我想用它的原始名称保存它。为此,我知道我必须调用app.use(multer({ dest: 'uploads/' }))' ,然后我才能访问req.file我的函数,例如:

app.post('/uploadImage', function(req, res) {
    console.log(req.file);
});

但是在尝试 app.use() 时出现错误:

TypeError: app.use() requires middleware functions
    at EventEmitter.use (project\node_modules\express\lib\application
.js:209:11)

我使用 NodeJS 0.12.7 和 Express 4.13.1

我怎样才能实现那个上传?谢谢。

4

7 回答 7

59

您需要以app.use(multer({dest:'./uploads/'}))下列形式之一使用:

app.use(multer({dest:'./uploads/'}).single(...));
app.use(multer({dest:'./uploads/'}).array(...));
app.use(multer({dest:'./uploads/'}).fields(...));

IE:

app.use(multer({dest:'./uploads/'}).single('photo'));

并确保有类似的东西:

<form action="/postPhotos" enctype="multipart/form-data" method="post">
    <input type="file" name="photo">
    <input type="submit" value="Upload photo">
</form>

在你的 html 中。

于 2015-07-27T23:28:28.730 回答
21
var app = require('express');

var multer = require('multer');

app=express();

app.use(multer({dest:__dirname+'/file/uploads/'}).any());

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

    console.log(req.files);

    res.redirect('/');

});
于 2016-03-15T19:46:49.040 回答
10

@127.0.0.1 的答案是正确的,但是如果您使用的是Express Router,代码会发生一些变化:

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

var router = express.Router();

var uploads = multer({
  dest: 'public/uploads/'
});

router.post('/upload', uploads.single('avatar'), function(req, res, next) {
  console.log(req.file);

  //...
});

重要的是,表单编码应该enctype="multipart/form-data"如前所述,如下所示:

<form action="/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="avatar">
    <input type="submit" value="Go avatar go!">
</form>
于 2016-05-13T06:59:24.290 回答
7

您不能使用 multer 更改文件名,但您可以使用 Node.js 流和 fs 模块将已上传文件的内容复制到同一文件夹中的新文件(设置为原始文件名)并删除旧文件。

首先在你的节点脚本中导入 fs、path 和 multer。

var express = require('express');
var multer = require('multer');
var fs = require('fs');
var pathModule = require('path');

现在,使用 multer 设置任何类型文件的目标目录,如下所示。

var app = express();
app.use(multer({dest:__dirname+'/resoucres/'}).any());

现在使用 stream 和 fs 来解决您的问题。

app.post('/uploadImage', function(request, response) {
    var readerStream = fs.createReadStream(request.files[0].path);
    var dest_file = pathModule.join(request.files[0].destination, request.files[0].originalname);
    var writerStream = fs.createWriteStream(dest_file);

    var stream = readerStream.pipe(writerStream);
    stream.on('finish', function(){
        fs.unlink(request.files[0].path);
    });
});
于 2017-05-22T11:34:04.890 回答
6

从版本 1.0.0

var upload = multer({ dest: 'tmp/' });
app.post('/file_upload', upload.single('photo'), function (req, res) {
于 2015-09-12T10:43:43.197 回答
4

更改为 app.use(multer({dest:'./uploads/'}).single('photo')); 在 app.js 中为我工作以启动服务器

于 2016-05-20T10:51:01.907 回答
2

我遇到了同样的问题。我解决了它。对于第一个问题,如何获取原始文件名?我打印了整个请求,发现我们可以通过使用路径“req.file.originalname”来获取原始名称

另一个问题,如何使用“app.use()”?
指:这里

于 2016-07-05T07:22:14.393 回答