Soru Express 4.0 ile dosya yükleme: req.files undefined


Express 4.0 ile çalışan basit bir dosya yükleme mekanizması elde etmeye çalışıyorum ama almaya devam ediyorum undefined için req.files içinde app.post vücut. İşte ilgili kod:

var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//...
app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true })); 
app.use(methodOverride()); 
//...
app.post('/fileupload', function (req, res) {
  console.log(req.files); 
  res.send('ok'); 
}); 

.. ve beraberindeki Yeşim kodu:

form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
    input(type="file", name="file", id="file")
    input(type="submit", value="Upload")

Çözüm
Tarafından verilen yanıt sayesinde mscdex aşağıda, kullanmaya geçtim busboy yerine bodyParser:

var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy()); 
//...
app.post('/fileupload', function(req, res) {
    var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Uploading: " + filename); 
        fstream = fs.createWriteStream(__dirname + '/files/' + filename);
        file.pipe(fstream);
        fstream.on('close', function () {
            res.redirect('back');
        });
    });
});

189
2018-04-16 15:54


Menşei


Soruyu gönderdiğiniz için teşekkürler, çözümü gönderdiğiniz için daha minnettarız. Gerçekten faydalı - codin
Çözümü gönderdiğiniz için teşekkürler! - leaksterrr
Bu, birden çok dosya ile nasıl çalışır? - chovy
@chovy, birden fazla dosya ile gayet iyi çalışmalı - mscdex
app.post ('/ fileupload', busboy (), function (req, res) {yapmak mümkün) - Shimon Doodkin


Cevaplar:


body-parser modül sadece JSON ve urlencoded form gönderimleri, çok parçalı değil (dosyaları yüklüyorsanız durum böyle olur).

Multipart için, gibi bir şey kullanmanız gerekir connect-busboy veya multer veya connect-multiparty (Çok partili / zorlu, orijinal olarak express bodyParser ara yazılımında kullanılan şeydir). Ayrıca FWIW, busboy adında daha üst düzey bir katman üzerinde çalışıyorum reformed. Bir Express ara katman yazılımı ile birlikte gelir ve ayrıca ayrı olarak da kullanılabilir.


183
2018-04-16 19:11



Teşekkürler, işe yaradı. Her ne kadar kullanmam gerekti connect-busboy sadece yerine busboy. Özgün yazımı çözümle güncelledi. - safwanc
teşekkürler, aradığım şey - anztrax
Teşekkürler dostum! buldum connect-multiparty Bunların en iyisi! - neciu
Teşekkürler, en iyi cevap - Sudhanshu Gaur
mı reformed hala geliştirme aşamasında? Github'taki son taahhüdünüz 2014'tedir ... Bu arada, sizce multipart form verilerinin üstesinden gelmek için en iyi modül hangisidir? "En iyi" ile en iyi desteklenen ve daha fazla özellik (daha az hata), daha fazla özellik ve daha uzun bir geleceği ile çalışıyorum demek istiyorum. multerEn iyi destekli göründüğü için, ama hala daha fazla desteklenmesi gerektiğini düşünüyorum. - nbro


İşte burayı gezdim:

var fileupload = require("express-fileupload");

Yüklemeler için oldukça basit bir mekanizma hangisidir?

app.post("/upload", function(req, res)
{
    var file;

    if(!req.files)
    {
        res.send("File was not found");
        return;
    }

    file = req.files.FormFieldName;  // here is the field name of the form

    file.mv("file.txt", function(err)  //Obvious Move function
        {
              // log your error
        });

    res.send("File Uploaded");


});

11
2017-10-09 10:58



Bilgi için teşekkürler - wmehanna
büyük dosyalar için çok yavaş - Eduardo
Kullanmadın fileupload? - BrandonFlynn-NB


Benziyor body-parser  did Express 3'te dosya yükleme desteği, ancak Express 4 için destek, artık dahil değil Bağımlılık olarak bağlan

Mscdex'in cevabındaki bazı modülleri inceledikten sonra, bunu buldum. express-busboy çok daha iyi bir alternatif ve bir yere koyma yerine en yakın şeydi. Fark ettiğim tek farklar, yüklenen dosyanın özelliklerinde idi.

console.log(req.files) kullanma vücuda ayrıştırıcı (Express 3) şöyle bir nesne çıktı:

{ file: 
   { fieldName: 'file',
     originalFilename: '360px-Cute_Monkey_cropped.jpg',
     name: '360px-Cute_Monkey_cropped.jpg'
     path: 'uploads/6323-16v7rc.jpg',
     type: 'image/jpeg',
     headers: 
      { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"',
        'content-type': 'image/jpeg' },
     ws: 
      WriteStream { /* ... */ },
     size: 48614 } }

nazaran console.log(req.files) kullanma ekspres-komi (Hızlı 4):

{ file: 
   { field: 'file',
     filename: '360px-Cute_Monkey_cropped.jpg',
     file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg',
     mimetype: 'image/jpeg',
     encoding: '7bit',
     truncated: false
     uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } }

10
2018-04-23 20:00





multer "multipart / form-data" ve sihirli bir şekilde işleyen ve talep edilen dosya ve form verilerini istek üzerine request.files ve request.body olarak sunan bir ara yazılımdır.

dümen yükleme: - npm install multer --save

.html dosyasında: -

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="hidden" name="msgtype" value="2"/>
    <input type="file" name="avatar" />
    <input type="submit" value="Upload" />
</form>

.js dosyasında: -

var express = require('express');
var multer = require('multer');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var upload = multer({ dest: 'uploads/' });

app.use(function (req, res, next) {
  console.log(req.files); // JSON Object
  next();
});

server.listen(port, function () {
  console.log('Server successfully running at:-', port);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/file-upload.html');
})

app.post('/upload', upload.single('avatar'),  function(req, res) {
  console.log(req.files); // JSON Object
});

Bu yardımcı olur umarım!


4
2017-12-15 05:30





SORUN ÇÖZÜLDÜ !!!!!!!

Dışarı çıkıyor storage işlev bile bir kez bile çalışmıyor. çünkü eklemek zorundaydım app.use(upload) gibi upload = multer({storage}).single('file');

 let storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './storage')
          },
          filename: function (req, file, cb) {
            console.log(file) // this didn't print anything out so i assumed it was never excuted
            cb(null, file.fieldname + '-' + Date.now())
          }
    });

    const upload = multer({storage}).single('file');

0
2018-06-24 15:39





express-fileupload Hala bu günlerde çalışan tek ara katmana benziyor.

Aynı örnekle multer ve connect-multiparty undefined bir değer verir req.file veya req.files, fakat express-fileupload Eserleri.

Ve boş değerle ilgili birçok soru ve sorun var. req.file / req.files.


-2
2018-01-13 14:10