🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

একটি Node.js API-এ ফাইল আপলোডগুলি কীভাবে পরিচালনা করবেন: সম্পূর্ণ 2026 গাইড

⏱️3 min read  ·  468 words

ফাইল আপলোডগুলি সঠিকভাবে পরিচালনা করার জন্য কেবল একটি ফাইল গ্রহণ করার চেয়ে আরও বেশি কিছু জড়িত — আপনার বৈধতা, স্টোরেজ কৌশল, সুরক্ষা এবং প্রায়শই চিত্র প্রক্রিয়াকরণ প্রয়োজন৷ এই নির্দেশিকা Node.js-এ সাধারণ স্থানীয় স্টোরেজ থেকে স্কেলযোগ্য ক্লাউড আপলোড পর্যন্ত শক্তিশালী ফাইল আপলোডগুলিকে কভার করে৷

আপলোড কৌশল ওভারভিউ

কৌশল জন্য সেরা
স্থানীয় ডিস্ক স্টোরেজ ছোট অ্যাপস, একক সার্ভার
আপনার সার্ভারে আপলোড করুন, তারপর ক্লাউড স্টোরেজ করার আগে প্রসেসিং প্রয়োজন
ডাইরেক্ট-টু-ক্লাউড (নির্ধারিত ইউআরএল) বড় ফাইল, স্কেল, সেরা অনুশীলন

মাল্টার দিয়ে বেসিক আপলোড

npm install multer
const multer = require('multer');
const path = require('path');

const storage = multer.diskStorage({
  destination: './uploads',
  filename: (req, file, cb) => {
    // Generate a safe, unique filename - never trust the client's name
    const unique = Date.now() + '-' + Math.round(Math.random() * 1e9);
    cb(null, unique + path.extname(file.originalname));
  },
});

const upload = multer({
  storage,
  limits: { fileSize: 5 * 1024 * 1024 },   // 5MB limit
  fileFilter: (req, file, cb) => {
    // Only allow specific types
    const allowed = ['image/jpeg', 'image/png', 'image/webp'];
    if (allowed.includes(file.mimetype)) {
      cb(null, true);
    } else {
      cb(new Error('Only JPEG, PNG, and WebP images allowed'));
    }
  },
});

app.post('/upload', upload.single('file'), (req, res) => {
  res.json({ filename: req.file.filename, size: req.file.size });
});

ফাইলগুলি সঠিকভাবে যাচাই করুন (একা MIME প্রকারকে বিশ্বাস করবেন না)

npm install file-type
const { fileTypeFromBuffer } = require('file-type');
const fs = require('fs').promises;

// The client-provided MIME type can be faked - verify actual content
async function validateFile(filePath) {
  const buffer = await fs.readFile(filePath);
  const type = await fileTypeFromBuffer(buffer);

  const allowed = ['image/jpeg', 'image/png', 'image/webp'];
  if (!type || !allowed.includes(type.mime)) {
    await fs.unlink(filePath);   // delete the invalid file
    throw new Error('Invalid file content');
  }
  return type;
}

একাধিক ফাইল এবং ক্ষেত্র

// Multiple files under one field
app.post('/gallery', upload.array('photos', 10), (req, res) => {
  const files = req.files.map(f => ({ filename: f.filename, size: f.size }));
  res.json({ uploaded: files });
});

// Different fields
const uploadFields = upload.fields([
  { name: 'avatar', maxCount: 1 },
  { name: 'documents', maxCount: 5 },
]);
app.post('/profile', uploadFields, (req, res) => {
  const avatar = req.files.avatar?.[0];
  const docs = req.files.documents || [];
  res.json({ avatar: avatar?.filename, docCount: docs.length });
});

শার্প দিয়ে ইমেজ প্রসেসিং

npm install sharp
const sharp = require('sharp');

// Resize and optimize uploaded images
async function processImage(inputPath, outputPath) {
  await sharp(inputPath)
    .resize(1200, 1200, { fit: 'inside', withoutEnlargement: true })
    .webp({ quality: 80 })       // convert to WebP, compress
    .toFile(outputPath);
}

// Generate a thumbnail
async function makeThumbnail(inputPath, thumbPath) {
  await sharp(inputPath)
    .resize(200, 200, { fit: 'cover' })
    .toFile(thumbPath);
}

নির্ধারিত ইউআরএল সহ ডাইরেক্ট-টু-ক্লাউড আপলোড (স্কেলের জন্য সেরা)

বড় ফাইল এবং স্কেলের জন্য, আপনার সার্ভারের মাধ্যমে আপলোডগুলিকে রুট করবেন না — আপনার ব্যাকএন্ড তৈরি করা একটি নির্ধারিত URL ব্যবহার করে ক্লায়েন্টদের সরাসরি S3 এ আপলোড করতে দিন:

const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');

const s3 = new S3Client({ region: 'us-east-1' });

// Backend: generate a presigned upload URL
app.post('/upload-url', async (req, res) => {
  const { filename, contentType } = req.body;
  const key = `uploads/${Date.now()}-${filename}`;

  const command = new PutObjectCommand({
    Bucket: 'my-bucket',
    Key: key,
    ContentType: contentType,
  });
  const uploadUrl = await getSignedUrl(s3, command, { expiresIn: 300 });

  res.json({ uploadUrl, key });
});
// Frontend: upload directly to S3, bypassing your server
const { uploadUrl, key } = await fetch('/upload-url', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ filename: file.name, contentType: file.type }),
}).then(r => r.json());

await fetch(uploadUrl, {
  method: 'PUT',
  headers: { 'Content-Type': file.type },
  body: file,   // uploads straight to S3 - no server bottleneck
});

নিরাপত্তা চেকলিস্ট

  • বিষয়বস্তু দ্বারা ফাইলের প্রকার যাচাই করুন, শুধু ক্লায়েন্টের MIME প্রকার নয় (যা নকল হতে পারে) ফাইলের আকার সীমিত করুন
  • প্রতিটি স্তরে (multer, nginx, cloud)নিরাপদ ফাইলের নাম তৈরি করুন
  • — কখনই সরাসরি ক্লায়েন্টের ফাইলের নাম ব্যবহার করবেন না (পাথ ট্রাভার্সাল রিস্ক)ওয়েব রুটের বাইরে সঞ্চয় করুন
  • অথবা ক্লাউড স্টোরেজে, কোনো সর্বজনীনভাবে পরিবেশনযোগ্য ডিরেক্টরিতে নয় যা আপলোডগুলি চালাতে পারেম্যালওয়্যার জন্য স্ক্যান করুন
  • যদি অবিশ্বস্ত ব্যবহারকারীদের কাছ থেকে ফাইল গ্রহণ করা হয়সঠিক বিষয়বস্তু-প্রকার এবং বিষয়বস্তু-স্বভাব সেট করুন
  • ফাইল ফেরত দেওয়ার সময়প্রায়শই জিজ্ঞাসিত প্রশ্ন

প্রশ্ন: আপলোডগুলি কি আমার সার্ভারের মাধ্যমে বা সরাসরি ক্লাউড স্টোরেজে যাওয়া উচিত?

উত্তর: ছোট ফাইলগুলির জন্য বা যখন আপনাকে প্রথমে সেগুলি প্রক্রিয়া করতে হবে, আপনার সার্ভারের মাধ্যমে (মাল্টার)। বড় ফাইল এবং স্কেলের জন্য, নির্ধারিত ইউআরএল ব্যবহার করুন যাতে ক্লায়েন্টরা সরাসরি S3-তে আপলোড করে — এটি আপনার সার্ভারের ব্যান্ডউইথ এবং আকারের সীমা এবং স্কেলগুলিকে বাইপাস করে।
প্রশ্ন: কেন আমি ক্লায়েন্টের MIME প্রকারের উপর আস্থা রাখব না?

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

উত্তর: ডাইরেক্ট-টু-ক্লাউড আপলোডের জন্য নির্ধারিত ইউআরএল ব্যবহার করুন (কোনও সার্ভারের বাধা নেই), অথবা বিশাল ফাইলের জন্য খণ্ডিত/পুনরায় শুরু করা আপলোডগুলি প্রয়োগ করুন। আপনার সার্ভারের মাধ্যমে রাউটিং করলে সমস্ত স্তরে (multer, nginx, ক্লাউড) আকারের সীমা বাড়ান, তবে বড় ফাইলের জন্য সরাসরি-টু-ক্লাউড ভাল।
প্রশ্ন: আপলোড করা ফাইলগুলো আমার কোথায় সংরক্ষণ করা উচিত?

উত্তর: স্কেলেবিলিটি এবং নির্ভরযোগ্যতার জন্য ক্লাউড অবজেক্ট স্টোরেজ (S3, GCS, R2) — আপনার অ্যাপ সার্ভারের ডিস্কে নয় (যা সার্ভারটি প্রতিস্থাপন করা হলে তা হারিয়ে যায়)। ছোট একক-সার্ভার অ্যাপ্লিকেশনগুলির জন্য, স্থানীয় ডিস্ক কাজ করে তবে আপনি বড় হওয়ার সাথে সাথে ক্লাউড স্টোরেজে স্থানান্তরিত করার পরিকল্পনা করুন৷
প্রশ্ন: কিভাবে আমি আপলোড করা ফাইলগুলিকে কার্যকর করা থেকে আটকাতে পারি?

উত্তর: ওয়েব রুটের বাইরে বা ক্লাউড স্টোরেজে আপলোডগুলি সঞ্চয় করুন, এলোমেলো ফাইলের নাম তৈরি করুন, বিষয়বস্তুর প্রকার যাচাই করুন এবং সঠিক শিরোনাম সহ ফাইলগুলি পরিবেশন করুন (কন্টেন্ট-ডিসপোজিশন: ডাউনলোডের জন্য সংযুক্তি)। ব্যবহারকারীর আপলোডগুলি কখনই এমন একটি ডিরেক্টরিতে সংরক্ষণ করবেন না যেখানে ওয়েব সার্ভার সেগুলিকে স্ক্রিপ্ট হিসাবে চালাবে৷
উপসংহার

Node.js-এ ফাইল আপলোড পরিচালনা করার জন্য একটি ফাইল গ্রহণ করার চেয়ে আরও বেশি কিছু প্রয়োজন। ব্যবহার করুন

আকার সীমা এবং টাইপ ফিল্টারিং সহ সার্ভার-সাইড আপলোডের জন্য মাল্টার, প্রকৃত বিষয়বস্তু (ক্লায়েন্টের MIME টাইপ নয়) দ্বারা ফাইলগুলি যাচাই করুন এবং শার্পদিয়ে চিত্রগুলি প্রক্রিয়া করুন। . স্কেল এবং বড় ফাইলের জন্য,ব্যবহার করুন৷ ক্লায়েন্টদের সরাসরি ক্লাউড স্টোরেজে আপলোড করতে দেওয়ার জন্য নির্ধারিত URLs, আপনার সার্ভার বাইপাস. সর্বদা নিরাপত্তা অনুশীলনগুলি অনুসরণ করুন: সামগ্রী যাচাই করুন, আকার সীমাবদ্ধ করুন, নিরাপদ ফাইলের নাম তৈরি করুন এবং ফাইলগুলিকে ক্লাউড স্টোরেজে বা ওয়েব রুটের বাইরে সংরক্ষণ করুন৷ সঠিকভাবে আপলোড করা মানে সুবিধা, কর্মক্ষমতা এবং নিরাপত্তার ভারসাম্য বজায় রাখা — সঠিক বৈধতা সহ সরাসরি-টু-ক্লাউড হল বেশিরভাগ অ্যাপ্লিকেশনের জন্য আধুনিক সেরা অনুশীলন।, আপনার সার্ভার বাইপাস. সর্বদা নিরাপত্তা অনুশীলনগুলি অনুসরণ করুন: সামগ্রী যাচাই করুন, আকার সীমাবদ্ধ করুন, নিরাপদ ফাইলের নাম তৈরি করুন এবং ফাইলগুলিকে ক্লাউড স্টোরেজে বা ওয়েব রুটের বাইরে সংরক্ষণ করুন৷ সঠিকভাবে আপলোড করা মানে সুবিধা, কর্মক্ষমতা এবং নিরাপত্তার ভারসাম্য বজায় রাখা — সঠিক বৈধতা সহ সরাসরি-টু-ক্লাউড হল বেশিরভাগ অ্যাপ্লিকেশনের জন্য আধুনিক সেরা অনুশীলন।

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা