node js普通文件上传代码在执行时显示错误

时间:2015-11-21 05:15:21

标签: javascript node.js express multer

我正在使用node.jsexpress模块尝试使用简单的multer文件上传代码进行测试。我的代码查找html,如: -

<html>
 <head>
   <title>File Uploading Form</title>
 </head>
 <body>
   <h3>File Upload:</h3>
       Select a file to upload: <br />
        <form action="http://127.0.0.1:8081/file_upload" method="POST" 
          enctype="multipart/form-data">
          <input type="file" name="file" size="50" />
          <br />
          <input type="submit" value="Upload File" />
        </form>
 </body>

和我的server.js代码如下: -

var express = require('express');
var app = express();
var fs = require("fs");

var bodyParser = require('body-parser');
var multer  = require('multer');

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}));

app.get('/index.html', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
});

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

console.log(req.files.file.name);
console.log(req.files.file.path);
console.log(req.files.file.type);

var file = __dirname + "/" + req.files.file.name;
fs.readFile( req.files.file.path, function (err, data) {
    fs.writeFile(file, data, function (err) {
     if( err ){
          console.log( err );
     }else{
           response = {
               message:'File uploaded successfully',
               filename:req.files.file.name
          };
      }
      console.log( response );
      res.end( JSON.stringify( response ) );
     });
   });
 });

var server = app.listen(8081, function () {

var host = server.address().address
var port = server.address().port

  console.log("Example app listening at http://%s:%s", host, port)

 });

现在我从命令提示符运行server.js,如: - node server.js我的服务器没有启动,它会抛出一些错误,如图像: -

My error picture

1 个答案:

答案 0 :(得分:1)

SOuřaanGřg,

您的行var multer = require('multer');正在返回并且是对象,而不是中间件函数。您可以使用三种中间件功能。

查看docs

  

如果您需要处理纯文本的多部分表单,可以使用任何multer方法(.single(),. array(),fields())。

  •   

    .single(fieldname)
    接受名为fieldname的单个文件。单个文件将存储在req.file中。

  •   

    .array(fieldname [,maxCount])
    接受一系列文件,所有文件都包含   名称字段名称。如果超过maxCount文件,则可选择输出错误   上传。文件数组将存储在req.files中。

  •   

    .fields(字段)
    接受由字段指定的混合文件。一个东西   文件数组将存储在req.files中。

您必须更改app.use(multer({ dest: '/tmp/'}));。你正在传递一个物体。

另据文档说明:

  

警告:确保始终处理用户上传的文件。永远不要将multer添加为全局中间件,因为恶意用户可以将文件上传到您没有预料到的路由。仅在处理上载文件的路径上使用此功能。

您应该将中间件分配给处理上载的路由。对于您的情况,您可以执行以下操作:

var upload = multer({ dest: '/tmp/' });

app.post('/file_upload', upload.single('file'), function (req, res, next) {
  // req.file is the `file` file 
  // req.body will hold the text fields, if there were any 
})