Düğüm Multer beklenmeyen alan


134

Multer npm modülünü kullanarak uygulamama dosya yüklemeye çalışıyorum.

Tanımladığım birleştirme işlevi, dosya sistemine tek bir dosyanın yüklenmesine izin vermektir. Her şey çalışma süresi boyunca çalışır; sorun dosyayı yükledikten sonra aşağıda bir hata alıyorum. Nereye bakılacağına dair herhangi bir tavsiye.

Hata:

Unexpected field

Error: Unexpected field
    at makeError (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-error.js:12:13)
    at wrappedFileFilter (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\index.js:39:19)
    at Busboy.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-middleware.js:97:7)
    at Busboy.emit (events.js:118:17)
    at Busboy.emit (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\main.js:31:35)
    at PartStream.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\types\multipart.js:205:13)
    at PartStream.emit (events.js:107:17)
    at HeaderParser.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:51:16)
    at HeaderParser.emit (events.js:107:17)
    at HeaderParser._finish (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:70:8) 

app.js

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

//. . . 

var upload = multer({ dest: 'upload/'});
var type = upload.single('file');

app.post('/upload', type, function (req,res) {
  var tmp_path = req.files.recfile.path;
  var target_path = 'uploads/' + req.files.recfile.name;
fs.readFile(tmp_path, function(err, data)
{
  fs.writeFile(target_path, data, function (err)
  {
    res.render('complete');
  })
});

Index.hbs

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name='recfile' placeholder="Select file"/>
    <br/>
    <button>Upload</button>
</form>

#Package.json
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "easy-zip": "0.0.4",
    "express": "~4.13.1",
    "hbs": "~3.1.0",
    "less-middleware": "1.0.x",
    "morgan": "~1.6.1",
    "multer": "~1.0.0",
    "serve-favicon": "~2.3.0"
  }
}

Yanıtlar:


141

Name özniteliğine sahip type = file ile geçirilen parametre adının aynı olduğundan emin olmalıyız. upload.single('attr')

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

/** Permissible loading a single file, 
    the value of the attribute "name" in the form of "recfile". **/
var type = upload.single('recfile');

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

  /** When using the "single"
      data come in "req.file" regardless of the attribute "name". **/
  var tmp_path = req.file.path;

  /** The original name of the uploaded file
      stored in the variable "originalname". **/
  var target_path = 'uploads/' + req.file.originalname;

  /** A better way to copy the uploaded file. **/
  var src = fs.createReadStream(tmp_path);
  var dest = fs.createWriteStream(target_path);
  src.pipe(dest);
  src.on('end', function() { res.render('complete'); });
  src.on('error', function(err) { res.render('error'); });

});

89
Bunun neden işe yaradığını ve neyin farklı olduğunu açıklar mısınız? —_____—
IIllIIll

8
Charm gibi mükemmel çalışıyor. Type = file, name özniteliğine sahip, upload.single ('attr')
Ramki

1
Benim durumum çalışmıyor. Ben de aynı sorunla karşı karşıyayım. Ama benim penceremde makine kodu çalışıyor. MAC ile sorunlar yaşıyorum. Biri bana bu konuda yardımcı olabilir mi?
hardik Kaji

6
Html'deki type = "file" ad özelliği, sunucu kodundaki upload.single ('ad') ile eşleşmelidir.
Prasanth Jaya

Birden çok dosyanın yüklenmesi için istemci isteği nasıl ayarlanır? 'Dosyalar' alanı boş.
吳 強 福

219

<NAME>Eğer multer en kullandığınız upload.single(<NAME>)işlevin içinde kullandığınız aynı olmalıdır <input type="file" name="<NAME>" ...>.

Yani değişmen gerek

var type = upload.single('file')

için

var type = upload.single('recfile')

app.js'de

Bu yardımcı olur umarım.


2
Bunu 'avatar' ile doldurmak yerine benioku dosyasına koysalar yardımcı olur.
hugos

1
Ama yine de yanlış kullanım durumunda istisnadan kaçınmamız gerekiyor .. Bu istisnayı nasıl yakalayabiliriz?
syberkitten

Referans olması için, curl kullanıyorsanız ve komut şöyle görünüyorsa: curl -v -F upload=@/myfile.txt localhost: 3000 / upload Daha sonra upload.single için değer "upload"
chrismarx

19

Vincent'ın cevabının devamı.

Soru bir form kullandığından, soruya doğrudan bir cevap değil.

Benim için, kullanılan giriş etiketinin adı değil, dosyayı formData'ya eklerken kullanılan addı.

ön uç dosyası

   var formData = new FormData();
   formData.append('<NAME>',this.new_attachments)

web servis dosyası:

   app.post('/upload', upload.single('<NAME>'),...

Bu günümü kurtardı. Teşekkür ederim. FormData.append () kullanırsanız, <input> etiketindeki ad özniteliğinin üzerine yazılır ve diğer çözümlerin çalışmamasına neden olur.
Schmidko,

1
Bu cevap çok önemli ve inanılmaz derecede yardımcı. formDataAnahtar adının uploadanahtar argümanla aynı olduğundan emin olmak çok önemlidir. Şimdi benim için çalışıyor.
Modermo

4

çünkü 2 resim yükleniyor! dosya uzantılı bir dosya ve uzantısız diğer dosya. tmp_path silmek için (uzantısız dosya)

sonra
src.pipe(dest);

aşağıdaki kodu ekle

fs.unlink(tmp_path); //deleting the tmp_path


4

Bu, kullanabileceğiniz Api için

 const express        = require('express');
 const bodyParser     = require('body-parser');
 const app = express();
 var multer = require('multer');
 const port = 8000;
 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({ extended: true }));

 app.listen(port, ()=>{
 console.log('We are live on' + port);
 });

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

 app.post('/post', upload.single('file'), function(req, res) {
  console.log(req.file);
 res.send("file saved on server");
 });

Bu aynı zamanda Postman'da iyi çalışıyor, ancak dosya .jpg uzantısıyla gelmiyor mu? Aşağıda yorumlandığı gibi

Uzantısı olmayan dosya yüklerse, bu, birleştiricinin varsayılan özelliğidir, ancak size dosyanın uzantısını güncelleyebileceğiniz dosya nesnesini sağlar.

var filename = req.file.filename; 
var mimetype = req.file.mimetype; 
mimetype = mimetype.split("/"); 
var filetype = mimetype[1]; 
var old_file = configUploading.settings.rootPathTmp+filename; 
var new_file = configUploading.settings.rootPathTmp+filename+'.'+filetype; 
rname(old_file,new_file);

1

Ne yazık ki, hata mesajı gerçek sorunun ne olduğu hakkında net bilgi sağlamaz. Bunun için biraz hata ayıklama gereklidir.

Yığın izlemesinden, multerpaketteki hatanın kaynağı şu şekildedir:

function wrappedFileFilter (req, file, cb) {
  if ((filesLeft[file.fieldname] || 0) <= 0) {
    return cb(makeError('LIMIT_UNEXPECTED_FILE', file.fieldname))
  }

  filesLeft[file.fieldname] -= 1
  fileFilter(req, file, cb)
}

Ve burada uygulanan garip (muhtemelen yanlış) çeviri, mesajın kendisinin kaynağıdır ...

'LIMIT_UNEXPECTED_FILE': 'Unexpected field'

filesLeftsunucunuzun beklediği file.fieldnamealanın adını içeren ve istemci tarafından sağlanan alanın adını içeren bir nesnedir . İstemci tarafından sağlanan alan adı ile sunucu tarafından beklenen alan adı arasında bir uyumsuzluk olduğunda hata atılır.

Çözüm, istemcideki veya sunucudaki adı değiştirerek ikisinin de aynı fikirde olmasını sağlamaktır.

Örneğin fetch, müşteri üzerinde kullanırken ...

var theinput = document.getElementById('myfileinput')
var data = new FormData()
data.append('myfile',theinput.files[0])
fetch( "/upload", { method:"POST", body:data } )

Ve sunucunun aşağıdaki gibi bir rotası olacaktır ...

app.post('/upload', multer(multerConfig).single('myfile'),function(req, res){
  res.sendStatus(200)
}

myfileOrtak adın bu olduğuna dikkat edin (bu örnekte).


Çok teşekkür ederim. Yorumunuz bana hatam hakkında bir ipucu verdi. Benim durumumda, farklı görünümlerde ve farklı yönlendirici dosyalarında 2 formum vardı. İlk yönlendirici, birinci görünümde ad alanını kullandı ve dosya adı "imgLoading" idi. İkinci görünümde dosya girişi olarak başka bir ad vardı. Bazı nedenlerden ötürü, multer farklı görünümlerde farklı isimler belirlemenize izin vermiyor, bu yüzden her iki görünümde de dosya girişi için aynı adı kullandım.
Luis Armando

1

İsteğime aktardığım ismi arayarak bu sorunları çözüyorum

Vücuda gönderiyordum:

{thumbbail: <myimg>}

ve bekliyordum:

upload.single('thumbnail')

bu yüzden istek üzerine gönderilecek adı düzeltirim


1

Adresinde " recfile " olarak gönderilen ve şurada<input type="file" name='recfile' placeholder="Select file"/> " dosya " olarak alınan farklı dosya adıupload.single('file')

Çözüm : Hem gönderilen hem de alınan dosyanın benzer olduğundan emin olunupload.single('recfile')


0

Senaryomda bu, içindeki bir parametreyi yeniden adlandırdığım swagger.yamlancak dokümanlar sayfasını yeniden yüklemediğim için oluyordu.

Bu yüzden beklenmedik bir girdi parametresiyle API'yi deniyordum.
Uzun lafın kısası, F5benim arkadaşım.


0

Muhtemelen 'da bahsettiğinizle aynı adı vermiyorsunuz upload.single('file').


0

Benim durumumda, farklı görünümlerde ve farklı yönlendirici dosyalarında 2 formum vardı. İlk yönlendirici, birinci görünümde ad alanını kullandı ve dosya adı "inputGroupFile02" idi. İkinci görünümün dosya girişi için başka bir adı vardı. Bazı nedenlerden dolayı Multer farklı görünümlerde farklı isimler belirlemenize izin vermez, bu yüzden her iki görünümde de dosya girişi için aynı adı kullanmaya karar verdim.

görüntü açıklamasını buraya girin

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.