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


239

Ben Express 4.0 ile basit bir dosya yükleme mekanizması çalışma almak için çalışılıyor ama almaya devam undefinediçin req.filesde app.postvücudun. İlgili 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 Pug 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 Aşağıdaki mscdex
tarafından verilen yanıt sayesinde , yerine kullanmaya geçtim :busboybodyParser

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');
        });
    });
});

1
bu birden fazla dosyayla nasıl çalışır?
chovy

@chovy birden fazla dosya ile iyi çalışmalıdır
mscdex

2
ithink app.post ('/ fileupload', busboy (), fonksiyon (req, res) yapmak mümkündür {
Shimon Doodkin

İyi bir çözüm Sadece ./files/uygulamanızın ana dizininde bir dizin oluşturmak gerektiğini not etmek istedim aksi takdirde yükledikten sonra bir hata alırsınız.
sos

Geçici dosyalar nasıl kullanılır? Busboy onları otomatik olarak siliyor mu? Sadece diske kaydetmeden önce geçici dosyaların silinmesini hiçbir yerde görmüyorum.
ed-ta

Yanıtlar:


210

body-parserModülü yalnızca (bu durum geçerli olacaktır Sen yükleme dosyaları varsa) değil çok parçalı JSON ve urlencoded form gönderimleri, yönetir.

Çok parçalı için, kullanımına gibi bir şey gerekiyordu connect-busboyya multerya connect-multiparty(çok partili / zorlu aslen ekspres bodyParser katman kullanılmıştır budur). Ayrıca FWIW, busboy'un üstünde daha da üst seviyede bir katman üzerinde çalışıyorum reformed. Bir Express ara katman yazılımı ile birlikte gelir ve ayrı olarak da kullanılabilir.


4
Teşekkürler, işe yaradı. Rağmen connect-busboysadece yerine kullanmak zorunda kaldı busboy. Orijinal gönderimi çözümle güncelledim.
safwanc

4
Teşekkürler dostum! connect-multipartyBunların en iyi seçeneğini buluyorum !
neciu

reformedhalen geliştirilmekte? Github'daki son taahhüdünüz 2014'ten ... Bu arada, sizce çok parçalı form verilerini işlemek için en iyi modül nedir? "En iyi" ile en iyi desteklenen ve daha iyi çalışır (daha az hata), daha fazla özellik ve daha uzun bir gelecek ile multerdemek ... Ben en iyi desteklenen görünüyordu çünkü seçtim , ama yine de daha fazla desteklenmesi gerektiğini düşünüyorum.
nbro

[DÜZENLEME: tamam, sadece aşağıdaki cevabı gördüm.] Ekspres 3.0'da çok parçalı mı ve 4.0'da mı kırıldı? çünkü bu öğretici 3.4.8 kullanır ve herhangi bir ekstra ara katman yazılımı gerek kalmadan dosyaları yükleyebilirsiniz çünkü blog.robertonodi.me/simple-image-upload-with-express
thetrystero 24:16

@thetrystero Bağlandığınız belirli örnek için github repo aslında repo bağımlılıkları kontrol. Bu bağımlılıkları incelerseniz, Express 3.x'in yanı sıra Connect 2.x'in (hala onunla birlikte gelen çok parçalı bir modülü vardı) dahil olduğunu göreceksiniz. Bu yüzden çok parçalı işleme "kutudan çıkmış" olarak çalışıyordu.
mscdex

31

İşte googling etrafında buldum:

var fileupload = require("express-fileupload");
app.use(fileupload());

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

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

    res.send("File Uploaded");


});

büyük dosyalar için çok yavaş
Eduardo

3
Kullanmadın fileuploadmı?
BrandonFlynn-NB

5
Yukarıdaki cevabın işe yaraması için, bu iki satırı ana sayfanıza eklemeniz gerekiyorapp.js const fileUpload = require('express-fileupload') app.use(fileUpload())
abhishake

11

Öyle görünüyor body-parser yaptım Express 3'te destek yükleme dosyalarını, ancak zaman destek Express 4 için düştü artık bir bağımlılık olarak bağlan dahil

Mscdex'in cevabındaki bazı modülleri inceledikten sonra express-busboy, bunun daha iyi bir alternatif olduğunu ve bir bırakma değişimine en yakın şey olduğunu buldum . Fark ettiğim tek fark yüklenen dosyanın özelliklerinde idi.

console.log(req.files)body-parser (Express 3) kullanarak şuna benzer bir nesne çıktısı alın:

{ 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 } }

ekspres-busboy (Express 4) console.log(req.files)kullanmaya kıyasla :

{ 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' } }

8

1) Dosyanızın gerçekten istemci tarafından gönderildiğinden emin olun. Örneğin, Chrome Konsolu'nda kontrol edebilirsiniz: ekran görüntüsü

2) İşte NodeJS arka ucunun temel örneği:

const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();

app.use(fileUpload()); // Don't forget this line!

app.post('/upload', function(req, res) {
   console.log(req.files);
   res.send('UPLOADED!!!');
});

7

multer , "çok bölümlü / form verilerini" işleyen ve sihirli bir şekilde yüklenen ve yüklenen dosyaları ve form verilerini request.files ve request.body olarak istek üzerine bize ulaştıran bir ara yazılımdır .

multer 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!



0

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

Dışarı Dönüşler storageişlevi bir kez bile çalıştırmak YOKTU. i dahil etmek zorunda çünkü app.use(upload)olarakupload = 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');

-1

express-fileupload Bu günlerde hala çalışan tek ara katman yazılımı gibi görünüyor.

Aynı örnekle multerve req.file veya req.filesconnect-multiparty için tanımlanmamış bir değer verir , ancakexpress-fileupload çalışır.

Ve req.file / req.files dosyalarının boş değeri hakkında birçok soru ve sorun ortaya çıkıyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.