এক্সপ্রেস 4.0.০ সহ ফাইল আপলোড: req.files অপরিশোধিত


239

আমি এক্সপ্রেস 4.0 সঙ্গে একটি সহজ ফাইল আপলোড প্রক্রিয়া কাজ করে তার জন্য চেষ্টা করছি কিন্তু আমি পাওয়া চালিয়ে undefinedজন্য req.filesapp.postশরীর। এখানে প্রাসঙ্গিক কোড:

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

.. এবং সাথে সংযুক্ত পগ কোড:

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

সমাধান নীচে এমএসসিডিএক্সের
প্রতিক্রিয়ার জন্য ধন্যবাদ , আমি এর পরিবর্তে ব্যবহার করতে স্যুইচ করেছি :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
এটি একাধিক ফাইলের সাথে কীভাবে কাজ করে?
chovy

@ চবি এটি একাধিক ফাইলের সাথে ঠিক কাজ করা উচিত
এমএসসিডিএক্স

2
আইথিংক দিয়ে অ্যাপ.পোস্ট ('/ ফাইলআপলোড', বাসবয় (), ফাংশন (
রেক

ভাল সমাধান আমি কেবল এটি নোট করতে চেয়েছিলাম যে আপনাকে ./files/আপনার অ্যাপের হোম ডিরেক্টরিতে একটি ডিরেক্টরি তৈরি করতে হবে অন্যথায় আপনি আপলোড করার পরে আপনি একটি ত্রুটি পাবেন।
সস

টেম্প ফাইলগুলি কীভাবে পরিচালনা করা হয়? বাসবয় সেগুলি কি স্বয়ংক্রিয়ভাবে মুছবে? আমি কেবল ডিস্কে সংরক্ষণের আগে টেম্প ফাইলগুলি মুছে ফেলা দেখতে পাচ্ছি না।
এড-টা

উত্তর:


210

body-parserমডিউল শুধুমাত্র JSON এবং urlencoded ফর্ম জমা, একাধিক নয় (যে ক্ষেত্রে হবে যদি তুমি আপলোড ফাইল) পরিচালনা করে।

একাধিক জন্য, আপনি ব্যবহার করতে চান কিছু প্রয়োজন চাই connect-busboyবা multerবা connect-multiparty(বহুদলীয় / দুর্দান্ত কি মূলত দ্রুতগামী bodyParser মিডলওয়্যার ক্ষেত্রে ব্যবহার করা হয়েছিল যায়)। এছাড়াও এফডাব্লুআইডাব্লু, আমি বাসবয়ের শীর্ষে একটি উচ্চ স্তরের স্তরে কাজ করছি reformed। এটি একটি এক্সপ্রেস মিডলওয়্যার সহ আসে এবং এটি পৃথকভাবে ব্যবহার করা যায়।


4
ধন্যবাদ, যে কাজ করেছে। যদিও আমাকে ন্যায়বিচারের connect-busboyপরিবর্তে ব্যবহার করতে হয়েছিল busboy। সমাধান সহ আমার মূল পোস্টটি আপডেট করেছে।
safwanc

4
ধন্যবাদ বন্ধু! আমি এর মধ্যে connect-multipartyসেরা খুঁজে পাই !
নেচিউ

reformedএখনও কি উন্নয়ন চলছে? গিথুব সম্পর্কে আপনার সর্বশেষ প্রতিশ্রুতিটি ২০১৪ সালের ... যাইহোক, আপনার মতে, মাল্টিপার্ট ফর্ম ডেটা হ্যান্ডেল করার জন্য সেরা মডিউলটি কী? "সেরা" বলতে আমি সর্বোত্তম সমর্থিত এবং এর চেয়ে আরও ভাল বৈশিষ্ট্য এবং আরও দীর্ঘ ভবিষ্যতের সাথে আরও ভাল (কম বাগগুলি) কাজ করে .. আমি বেছে নিয়েছি multerকারণ এটি সেরা সমর্থিত বলে মনে হয়েছিল, তবে আমি এখনও মনে করি এটি আরও সমর্থিত হওয়া উচিত।
nbro

[সম্পাদনা করুন: ঠিক আছে, ঠিক নীচের উত্তরটি দেখেছেন]] এক্সপ্রেস 3.0.০ এর সাথে বহুগঠিত হয়েছিলেন এবং তারপরে ৪.০ তে ভাঙলেন? আমি জিজ্ঞাসা করছি কারণ এই টিউটোরিয়ালটি ৩.৪.৮ ব্যবহার করে এবং কোনও অতিরিক্ত মিডলওয়্যার ব্লগ.রোবারটোনোডি.মে
সিম্পল-

@thetrystero গিথুব রেপো সেই নির্দিষ্ট উদাহরণটির জন্য যা আপনি সংযুক্ত করেছেন বাস্তবে নির্ভরতা রেপোতে যাচাই করা হয়েছে। যদি আপনি এই নির্ভরশীলতাগুলি খনন করেন তবে আপনি দেখতে পাবেন এক্সপ্রেস 3.x অন্তর্ভুক্ত রয়েছে, পাশাপাশি কানেক্ট 2.x (এটির সাথে এখনও একটি মাল্টিপার্ট মডিউল ছিল)। একারণে মাল্টিপার্ট হ্যান্ডলিং "বাক্সের বাইরে" কাজ করছিল।
mscdex

31

আমি এখানে প্রায় googling খুঁজে পেয়েছি:

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

যা আপলোডগুলির জন্য বেশ সহজ পদ্ধতি

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


});

বড় ফাইলগুলির জন্য খুব ধীর
এডুয়ার্ডো

3
আপনি ব্যবহার করেন নি fileupload?
ব্র্যান্ডনফ্লিন-এনবি

5
কাজের উপরের উত্তরের জন্য, আপনাকে এই মূল দুটি লাইন যুক্ত করতে হবেapp.js const fileUpload = require('express-fileupload') app.use(fileUpload())
অভিষেক

11

দেখে মনে হচ্ছে body-parser করেনি এক্সপ্রেস 3 ফাইলগুলি আপলোড হচ্ছে সমর্থন, কিন্তু সমর্থন যখন এটি এক্সপ্রেস 4 বাদ পড়ে আর নির্ভরতা যেমন কানেক্ট অন্তর্ভুক্ত

এমএসসিডেক্সের উত্তরের কয়েকটি মডিউল সন্ধানের পরে, আমি দেখতে পেলাম যে express-busboyএটি একটি আরও ভাল বিকল্প এবং একটি ড্রপ-ইন প্রতিস্থাপনের নিকটতম জিনিস। কেবলমাত্র তফাতগুলি আমি লক্ষ্য করেছি আপলোড করা ফাইলের বৈশিষ্ট্যগুলির মধ্যে।

console.log(req.files)ব্যবহার শরীর-পার্সার (এক্সপ্রেস 3) আউটপুট একটি বস্তু যে দেখতে এমন ছিল:

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

এক্সপ্রেস-বাসবয়console.log(req.files) ব্যবহারের সাথে তুলনা করুন (এক্সপ্রেস 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' } }

8

1) আপনার ফাইলটি সত্যই ক্লায়েন্টের পক্ষ থেকে প্রেরণ করা হয়েছে তা নিশ্চিত করুন। উদাহরণস্বরূপ আপনি এটি Chrome কনসোলে পরীক্ষা করতে পারেন: স্ক্রিনশট এ

2) এখানে নোডজেএস ব্যাকএন্ডের প্রাথমিক উদাহরণ:

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

মাল্টর একটি মিডলওয়্যার যা "মাল্টিপার্ট / ফর্ম-ডেটা" পরিচালনা করে এবং যাদুকরীভাবে এবং আপলোড করা ফাইলগুলি এবং ফর্ম ডেটা আমাদের কাছে অনুরোধ.ফাইলেস এবং অনুরোধ.বডি হিসাবে অনুরোধ হিসাবে উপলব্ধ করে।

মাল্টার ইনস্টল করা: npm install multer --save

html ফাইলে: -

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

জেএসএস ফাইলটিতে: -

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

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



0

সমস্যা সমাধান !!!!!!!

storageফাংশনটি চালু করে একবারেও চালানো হয় না। কারণ আমি app.use(upload)হিসাবে অন্তর্ভুক্ত ছিল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');

-1

express-fileupload একমাত্র মিডলওয়্যারের মতো দেখায় যা এই দিনগুলিতে এখনও কাজ করে।

একই উদাহরণ সহ, multerএবং req.file বা req.filesconnect-multiparty এর একটি অপরিবর্তিত মান দেয় , কিন্তুexpress-fileupload

এবং req.file / req.files এর খালি মূল্য সম্পর্কে অনেক প্রশ্ন ও সমস্যা উত্থাপিত হয়েছে ।

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