web-dev-qa-db-ja.com

multer-req.fileは常に未定義

私はこれと同じ質問に対して多くの答えを見てきましたが、実用的な解決策をまだ見つけていません。 expressとmulterを使用してファイルをアップロードできるWebアプリを作成しようとしていますが、ファイルがアップロードされておらず、req.fileが常に未定義であるという問題があります。

以下の私のコード

'use strict';

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

var app = express();
require('dotenv').load();

app.use(express.static(path.join(__dirname, 'main')));

app.post('/upload', upload.single('upl'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
  console.log(req.file);
  res.status(204).end();
})

var port = process.env.PORT || 8080;
app.listen(port,  function () {
    console.log('Node.js listening on port ' + port + '...');
});

フォーム

    <form class="uploadForm" action="/upload" method="post" enctype="multipart/formdata">
        <label class="control-label">Select File</label>
        <input name="upl" id="input-1" type="file" class="file">
        <input type="submit" value="submit" />
    </form>

どうぞよろしくお願いいたします。これは私を夢中にさせています。

16
mlamp

enctypeは少し間違っています。multipart/form-data の代わりに multipart/formdata

17
mscdex

郵便配達の場合は、以下を試してください:

  1. APIの[郵便配達]タブを閉じます
  2. もう一度新しいタブを開く
  3. APIリクエストを再構築して送信します。

これで問題が解決する場合があります。サーバーを再起動するたびに、APIを再度呼び出すために上記の手順を実行する必要があります。 multerである理由は、connect.sidと呼ばれるいくつかのcookieをクライアントに送り返します。古いCookieを使用しても、ファイルはアップロードされません。

26
Mohit Mittal

私は1日中検索したので、私のような多くの人を助けるためにMY(私が想像する多くがあり、確かにより良い)ソリューションを置きました;-(


//JS file on node side

var express = require('express');
var fileUpload = require('express-fileupload');
var fs = require("fs");
var app = express();
console.log('étape 0');
app.use(express.static('mesStatic'));
app.use(fileUpload());
console.log('étape 1');
app.get('/indexFileUpload.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "indexFileUpload.htm" );
})
console.log('étape 2');
app.post('/file_upload', function (req, res) {

   console.log('étape 3');
   console.log('req.files:' , req.files);
   if (!req.files) {
       res.send('No files to upload.');
       return;
   }

   console.log('req.files.file.data:' , req.files.file.data);
   var bufDataFile = new Buffer(req.files.file.data, "utf-8");
   console.log('étape 3.1');
   console.log('__dirname : ' + __dirname);
   fs.writeFile(__dirname + '/file_upload/output.txt', bufDataFile,  function(err) {
      if (err) {
         return console.error(err);
      }
      else {
         console.log("Data written successfully !");
      }      
      console.log('étape 4');
      res.end('Fin OK !!!');  
   })
})
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);
})
1
Arnaud BOURET

はい、あなたのenctypeは間違っています。それが唯一の問題です。 enctypeを修正してください。そうしないと、req.fileまたはreq.filesで未定義になる可能性があります。

0
Piyush Patel

これは、express-http-proxyを使用して呼び出しをプロキシする前にプロキシしたため、parseReqBody: falseオプションを使用してファイルを正しく送信する必要があったためです。

すなわち。

app.post('file/upload', proxy(process.env.API_URL, {
  parseReqBody: false,
}))
0
zpr

HTMLファイル

<form class="uploadForm" action="/upload" method="post" enctype="multipart/form-data">
    <label class="control-label">Select File</label>
    <input name="upl" id="input-1" type="file" class="file">
    <input type="submit" value="submit" />
</form>

app.js

var express=require("express");
var multer=require("multer");
var app=express();
var upload=multer({dest:"uploads/"});
app.post("/upload",upload.single("upl"),function(req,res){
console.log("Uploaded Successfull with filename : "+req.upl.filename);
});
0
Yash Bele