नोड मुल्टर अप्रत्याशित क्षेत्र


134

मैं multer npm मॉड्यूल का उपयोग करके अपने ऐप पर एक फ़ाइल अपलोड करने पर काम कर रहा हूं।

मैंने जो मूल्‍टर फ़ंक्शन परिभाषित किया है, वह फ़ाइल सिस्टम पर अपलोड की गई एकल फ़ाइल को अनुमति देने के लिए है। रन टाइम के दौरान सब कुछ काम करता है; मुद्दा यह है कि मैं फ़ाइल अपलोड करने के बाद मुझे नीचे एक त्रुटि मिलती है। जहां देखने के लिए किसी भी सलाह की सराहना की।

त्रुटि:

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

जवाबों:


139

हमें यह सुनिश्चित करना है कि नाम विशेषता के साथ प्रकार = फ़ाइल पैरामीटर नाम के समान हो 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
क्या आप बताएंगे कि यह क्यों काम करता है और क्या अलग है? -_____-
IIllIIll

8
पूरी तरह से charm.We की तरह काम करता है प्रकार = नाम विशेषता के साथ फ़ाइल पैरामीटर नाम ( 'attr') upload.single में पारित के रूप में ही किया जाना चाहिए सुनिश्चित करने के लिए है
Ramki

1
मेरा मामला यह काम नहीं कर रहा है। मैं उसी मुद्दे का सामना कर रहा हूं। लेकिन मेरी खिड़कियों में मशीन कोड काम कर रहा है। मैं अपने साथ मुद्दों कर रहा हूँ MAC।? क्या कोई मेरे साथ यह मदद कर सकता है?
हा --दिक काजी

6
Html में टाइप = "फ़ाइल" का नाम विशेषता सर्वर कोड में upload.single ('नाम') से मेल खाना चाहिए।
प्रशान्त जया

एक से अधिक फ़ाइलों के अपलोड के लिए क्लाइंट अनुरोध कैसे सेट करें? 'फ़ाइलें' फ़ील्ड रिक्त है।

219

<NAME>आप multer के में उपयोग upload.single(<NAME>)समारोह एक आप में उपयोग के समान होना चाहिए <input type="file" name="<NAME>" ...>

इसलिए आपको बदलने की जरूरत है

var type = upload.single('file')

सेवा

var type = upload.single('recfile')

आप में app.js

उम्मीद है की यह मदद करेगा।


2
यदि वे इसे 'अवतार' से भरने के बजाय रेडीम में डालते हैं तो यह मदद करेगा।
ह्यूजोस

1
लेकिन हमें अभी भी दुरुपयोग के मामले में अपवाद से बचने की आवश्यकता है .. इस अपवाद को कैसे पकड़ा जाए?
शाम

बस में संदर्भ के लिए, आप कर्ल का उपयोग कर रहे हैं, और इस तरह आदेश दिखाई देता है: कर्ल -v एफ upload=@/myfile.txt स्थानीय होस्ट: 3000 / अपलोड फिर upload.single के लिए मूल्य "अपलोड" है
chrismarx

19

विनसेंट के उत्तर तक अनुवर्ती।

प्रश्न का सीधा उत्तर नहीं है क्योंकि प्रश्न प्रपत्र का उपयोग कर रहा है।

मेरे लिए, यह उस इनपुट टैग का नाम नहीं था जिसका उपयोग किया गया था, लेकिन फ़ाइल को फॉर्मडेटा में जोड़ते समय नाम।

फ्रंट एंड फाइल

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

वेब सेवा फ़ाइल:

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

इससे मेरा दिन बच गया। धन्यवाद। यदि आप FormData.append () का उपयोग करते हैं, तो <इनपुट> टैग से जिम्मेदार नाम को अधिलेखित कर दिया जाएगा और अन्य समाधान काम नहीं करेंगे।
श्मिटको

1
यह उत्तर इतना महत्वपूर्ण और अविश्वसनीय रूप से सहायक है। यह सुनिश्चित करना कि formDataकुंजी का नाम uploadमहत्वपूर्ण तर्क के समान है। यह अब मेरे लिए काम करता है।
22

4

चूंकि 2 चित्र अपलोड हो रहे हैं! फ़ाइल एक्सटेंशन के साथ एक और एक्सटेंशन के बिना अन्य फ़ाइल। tmp_path को हटाने के लिए (एक्सटेंशन के बिना फ़ाइल)

उपरांत
src.pipe(dest);

नीचे कोड जोड़ें

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


4

इस Api के लिए आप उपयोग कर सकते हैं

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

यह भी Postman पर इस्तेमाल किया ठीक काम करता है, लेकिन फ़ाइल किसी भी सलाह के .jpg विस्तार के साथ नहीं आता है? जैसा कि नीचे टिप्पणी की गई है

यह मुल्टर की डिफ़ॉल्ट विशेषता है यदि फ़ाइल बिना एक्सटेंशन के अपलोड होती है, हालांकि, आपको फ़ाइल ऑब्जेक्ट प्रदान करता है, जिसके उपयोग से आप फ़ाइल के एक्सटेंशन को अपडेट कर सकते हैं।

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

दुर्भाग्य से, त्रुटि संदेश वास्तविक समस्या क्या है के बारे में स्पष्ट जानकारी प्रदान नहीं करता है। उसके लिए, कुछ डीबगिंग की आवश्यकता है।

स्टैक ट्रेस से, यहाँ multerपैकेज में त्रुटि की उत्पत्ति है :

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

और अजीब (संभवतः गलत तरीके से किया गया) अनुवाद यहां लागू किया गया संदेश का स्रोत है ...

'LIMIT_UNEXPECTED_FILE': 'Unexpected field'

filesLeftवह ऑब्जेक्ट है जिसमें आपके सर्वर द्वारा अपेक्षित file.fieldnameफ़ील्ड का नाम होता है , और क्लाइंट द्वारा प्रदान किए गए फ़ील्ड का नाम होता है। त्रुटि तब होती है जब क्लाइंट द्वारा प्रदान किए गए फ़ील्ड नाम और सर्वर द्वारा अपेक्षित फ़ील्ड नाम के बीच कोई बेमेल हो।

समाधान क्लाइंट या सर्वर पर नाम बदलने के लिए है ताकि दोनों सहमत हों।

उदाहरण के लिए, fetchक्लाइंट का उपयोग करते समय ...

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

और सर्वर में निम्नलिखित जैसे एक मार्ग होगा ...

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

ध्यान दें कि यह वह है myfileजो सामान्य नाम है (इस उदाहरण में)।


बहुत बहुत धन्यवाद। आपकी टिप्पणी ने मुझे मेरी त्रुटि के बारे में संकेत दिया। मेरे मामले में, मेरे पास अलग-अलग विचारों और भिन्न राउटर फ़ाइलों में 2 रूप थे। पहले राउटर ने व्यू फ़ील्ड के नाम का उपयोग किया था और इसका फ़ाइल नाम "इमग्लाडिंग" था। दूसरे दृश्य में फ़ाइल इनपुट का दूसरा नाम था। किसी कारण से आप विभिन्न नामों को अलग-अलग विचारों में सेट करने की अनुमति नहीं देते हैं, इसलिए मैंने दोनों दृश्यों में फ़ाइल इनपुट के लिए एक ही नाम का उपयोग किया।
लुइस आर्मंडो

1

मैं अपने अनुरोध पर पारित किए गए नाम की तलाश में इस मुद्दे को हल करता हूं

मैं शरीर पर भेज रहा था:

{thumbbail: <myimg>}

और मुझे उम्मीद थी:

upload.single('thumbnail')

इसलिए, मैं उस नाम को ठीक करता हूं जो अनुरोध पर भेजता है


1

भिन्न फ़ाइल नाम जो " पुनरावृत्ति " के रूप में पोस्ट किया गया है <input type="file" name='recfile' placeholder="Select file"/>और इसे " फ़ाइल " के रूप में प्राप्त किया गया है upload.single('file')

समाधान : सुनिश्चित करें कि भेजी और प्राप्त दोनों फ़ाइल समान हैंupload.single('recfile')


0

मेरे परिदृश्य में यह हो रहा था क्योंकि मैंने एक पैरामीटर का नाम बदल दिया swagger.yamlथा , लेकिन डॉक्स पृष्ठ को फिर से लोड नहीं किया।

इसलिए मैं एक अप्रत्याशित इनपुट पैरामीटर के साथ एपीआई की कोशिश कर रहा था।
लंबी कहानी छोटी, F5मेरी सहेली है।


0

शायद आप वही नाम नहीं दे रहे हैं जैसा आपने उल्लेख किया है upload.single('file')


0

मेरे मामले में, मेरे पास अलग-अलग विचारों और भिन्न राउटर फ़ाइलों में 2 रूप थे। पहले राउटर ने व्यू फ़ील्ड के नाम का उपयोग किया था और इसका फ़ाइल नाम "inputGroupFile02" था। दूसरा दृश्य फ़ाइल इनपुट के लिए एक और नाम था। किसी कारण से मुल्टर आपको अलग-अलग विचारों में भिन्न नाम सेट करने की अनुमति नहीं देता है, इसलिए मैंने दोनों दृश्यों में फ़ाइल इनपुट के लिए एक ही नाम का उपयोग करने का अनुरोध किया।

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.