【问题标题】:node js normal file upload code shows error while executingnode js正常文件上传代码执行时显示错误
【发布时间】:2015-11-21 05:15:21
【问题描述】:

我正在尝试使用expressmulter 模块来测试一个简单的node.js 文件上传代码。我的代码寻找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 我的服务器没有启动,它会抛出一些错误,例如图像:-

【问题讨论】:

标签: javascript node.js express multer


【解决方案1】:

Souřaan Gřg,

您的行,var multer = require('multer'); 是返回和对象,而不是中间件函数。您可以使用三个中间件函数。

查看docs

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

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

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

  • .fields(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 
})

【讨论】:

  • 兄弟使用您的代码app.use(multer({ dest: '/tmp/'})).single('file')); 我遇到了一个新错误,如下图:- New error
  • 抱歉打错了。复制这个:app.use(multer({ dest: '/tmp/'}).single('file'));
  • 兄弟现在我的服务器工作正常,我也可以查看index.html 页面。当我选择一个文件并尝试上传它时,它也会在页面上显示这个错误以及命令提示符 --> @ 987654323@
  • 它保存一个临时文件数据。如何在临时上传后保留该真实图像?我的意思是我在/tmp/ 目录上获得了file 类型,但我希望该真实图像也在文件夹中兄弟。那我们怎么做呢?
  • 兄弟,我在 server.js 代码所在的同一目录中创建了上传文件夹。
猜你喜欢
  • 2020-01-19
  • 2014-06-25
  • 2020-04-30
  • 2020-10-12
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
相关资源
最近更新 更多