নোড মুল্টার অপ্রত্যাশিত ক্ষেত্র


134

আমি মাল্টার এনপিএম মডিউলটি ব্যবহার করে আমার অ্যাপে একটি ফাইল আপলোড করার কাজ করছি।

আমি যে মাল্টর ফাংশনটি সংজ্ঞায়িত করেছি তা হ'ল ফাইল সিস্টেমে কোনও একক ফাইল আপলোড করার অনুমতি দেওয়া। রান চলাকালীন সময়ে সবকিছু কাজ করে; সমস্যাটি হ'ল আমি ফাইলটি আপলোড করার পরে আমি নীচে একটি ত্রুটি পেয়েছি। কোন পরামর্শ কোথায় তাকান প্রশংসা।

ত্রুটি:

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
এটি কেন কাজ করে এবং কী আলাদা তা বোঝাতে আপনার মনে হবে? —_____—
IIllIl

8
মনোযোগের মতো নিখুঁতভাবে কাজ করে sure আমাদের নিশ্চিত করতে হবে নামের বৈশিষ্ট্যযুক্ত টাইপ = ফাইলটি আপলোড.সিংলে ('অ্যাট্রি') -তে পাস হওয়া প্যারামিটার নামের মতো হওয়া উচিত
রামকি

1
আমার ক্ষেত্রে এটি কাজ করছে না। আমি একই সমস্যা সম্মুখীন। তবে আমার উইন্ডোতে মেশিন কোড কাজ করছে। আমার ম্যাক নিয়ে সমস্যা হচ্ছে। কেউ কি আমাকে এই সাহায্য করতে পারেন?
এইআরডিক কাজী

6
এইচটিএমএলতে = "ফাইল" টাইপের নামের বৈশিষ্ট্যটি সার্ভার কোডে আপলোড.সিংল ('নাম') এর সাথে মিলবে।
প্রশান্ত জয়া

একাধিক ফাইল আপলোডের জন্য ক্লায়েন্টের অনুরোধটি কীভাবে সেট করবেন? 'ফাইল' ক্ষেত্রটি খালি।
吳 強 福

219

<NAME>আপনি multer এর ব্যবহার upload.single(<NAME>)ফাংশন আপনি ব্যবহার হিসাবে একই হওয়া আবশ্যক <input type="file" name="<NAME>" ...>

সুতরাং আপনি পরিবর্তন প্রয়োজন

var type = upload.single('file')

প্রতি

var type = upload.single('recfile')

আপনি app.js মধ্যে

আশাকরি এটা সাহায্য করবে.


2
যদি তারা এটিকে 'অবতার' দিয়ে পূরণ করার পরিবর্তে রেডমে রাখে তবে এটি সহায়তা করবে।
hugos

1
তবে অপব্যবহারের ক্ষেত্রে আমাদের এখনও ব্যতিক্রম এড়াতে হবে .. এই ব্যতিক্রমটি কীভাবে ধরবেন?
syberkitten

কেবলমাত্র রেফারেন্সের জন্য, আপনি যদি কার্ল ব্যবহার করছেন, এবং কমান্ডটি এর মতো দেখাচ্ছে: curl -v -F upload=@/myfile.txt লোকালহোস্ট: 3000 / আপলোড তারপরে আপলোড.সিংলের মানটি "আপলোড"
ক্রিসমার্ক

19

ভিনসেন্টের উত্তরের অনুসরণ

যেহেতু প্রশ্নটি কোনও ফর্ম ব্যবহার করছে তাই প্রশ্নের সরাসরি উত্তর নয়।

আমার জন্য, এটি ব্যবহৃত হওয়া ইনপুট ট্যাগের নাম ছিল না, ফর্মডাটাতে ফাইল সংযোজন করার সময় নাম।

সামনের শেষ ফাইল

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

ওয়েব পরিষেবা ফাইল:

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

এটি আমার দিনকে বাঁচিয়েছিল। ধন্যবাদ. আপনি যদি ফর্মটাটা.অ্যাপেন্ড () ব্যবহার করেন তবে <ইনপুট> ট্যাগ থেকে নামটির বৈশিষ্ট্য ওভাররাইট করা হবে এবং অন্যান্য সমাধানগুলি কাজ করছে না।
শ্মিদকো

1
এই উত্তরটি এত গুরুত্বপূর্ণ এবং অবিশ্বাস্যরূপে সহায়ক। কী যুক্তি যেমন গুরুত্বপূর্ণ তাত্পর্য formDataহিসাবে গুরুত্বপূর্ণ নামটি নিশ্চিত করা uploadহয়। এটা এখন আমার জন্য কাজ করে।
Modermo

4

যেহেতু 2 টি চিত্র আপলোড হচ্ছে! ফাইল এক্সটেনশন সহ একটি এবং এক্সটেনশন ছাড়াই অন্য ফাইল। tmp_path মুছতে (এক্সটেনশন ছাড়াই ফাইল)

পরে
src.pipe(dest);

কোড নীচে যুক্ত করুন

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


4

এটি আপনি যে অ্যাপির জন্য ব্যবহার করতে পারেন তার জন্য

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

এটি পোস্টম্যানে ব্যবহৃত দুর্দান্ত কাজ করে তবে ফাইলটি .jpg এক্সটেনশন নিয়ে কোনও পরামর্শ দেয় না? নীচে মন্তব্য হিসাবে

এটি যদি কোনও এক্সটেনশান ছাড়াই ফাইল আপলোড করে তবে এটি মাল্টারের ডিফল্ট বৈশিষ্ট্য however

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যা সাধারণ নাম (এই উদাহরণে)।


তোমাকে অনেক ধন্যবাদ. আপনার মন্তব্যটি আমাকে আমার ত্রুটি সম্পর্কে ইঙ্গিত দিয়েছে। আমার ক্ষেত্রে, আমার কাছে ভিন্ন ভিন্ন ভিউ এবং ভিন্নতর রাউটার ফাইলগুলির মধ্যে দুটি ফর্ম ছিল। প্রথম রাউটারটি একটির সাথে নামের ক্ষেত্রটি ব্যবহার করেছিল এবং এর ফাইলটির নাম ছিল "ইমগলোডিং"। দ্বিতীয় ভিউয়ের অন্য একটি নাম ছিল ফাইল ইনপুট। কোনও কারণে মাল্টার আপনাকে আলাদা আলাদা ভিউতে আলাদা আলাদা নাম নির্ধারণ করতে দেয় না, তাই আমি উভয় মতামতটিতে ফাইল ইনপুটটির জন্য একই নামটি ব্যবহার করেছি।
লুইস আরমান্ডো

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

আমার ক্ষেত্রে, আমার কাছে ভিন্ন ভিন্ন ভিউ এবং ভিন্নতর রাউটার ফাইলগুলির মধ্যে দুটি ফর্ম ছিল। প্রথম রাউটারটি একের সাথে নামের ক্ষেত্রটি ব্যবহার করেছিল এবং এর ফাইলটির নাম ছিল "ইনপুটগ্রুপফিল02"। দ্বিতীয় ভিউয়ের ফাইল ইনপুটটির অন্য নাম ছিল। কোনও কারণে মুল্টার আপনাকে আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা করে নাম রাখতে দেয় না।

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.