ফাইল আপলোডগুলি সঠিকভাবে পরিচালনা করার জন্য কেবল একটি ফাইল গ্রহণ করার চেয়ে আরও বেশি কিছু জড়িত — আপনার বৈধতা, স্টোরেজ কৌশল, সুরক্ষা এবং প্রায়শই চিত্র প্রক্রিয়াকরণ প্রয়োজন৷ এই নির্দেশিকা Node.js-এ সাধারণ স্থানীয় স্টোরেজ থেকে স্কেলযোগ্য ক্লাউড আপলোড পর্যন্ত শক্তিশালী ফাইল আপলোডগুলিকে কভার করে৷
📋 Table of Contents
- আপলোড কৌশল ওভারভিউ
- মাল্টার দিয়ে বেসিক আপলোড
- ফাইলগুলি সঠিকভাবে যাচাই করুন (একা MIME প্রকারকে বিশ্বাস করবেন না)
- একাধিক ফাইল এবং ক্ষেত্র
- শার্প দিয়ে ইমেজ প্রসেসিং
- নির্ধারিত ইউআরএল সহ ডাইরেক্ট-টু-ক্লাউড আপলোড (স্কেলের জন্য সেরা)
- নিরাপত্তা চেকলিস্ট
- প্রশ্ন: আপলোডগুলি কি আমার সার্ভারের মাধ্যমে বা সরাসরি ক্লাউড স্টোরেজে যাওয়া উচিত?
- 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, আপনার সার্ভার বাইপাস. সর্বদা নিরাপত্তা অনুশীলনগুলি অনুসরণ করুন: সামগ্রী যাচাই করুন, আকার সীমাবদ্ধ করুন, নিরাপদ ফাইলের নাম তৈরি করুন এবং ফাইলগুলিকে ক্লাউড স্টোরেজে বা ওয়েব রুটের বাইরে সংরক্ষণ করুন৷ সঠিকভাবে আপলোড করা মানে সুবিধা, কর্মক্ষমতা এবং নিরাপত্তার ভারসাম্য বজায় রাখা — সঠিক বৈধতা সহ সরাসরি-টু-ক্লাউড হল বেশিরভাগ অ্যাপ্লিকেশনের জন্য আধুনিক সেরা অনুশীলন।, আপনার সার্ভার বাইপাস. সর্বদা নিরাপত্তা অনুশীলনগুলি অনুসরণ করুন: সামগ্রী যাচাই করুন, আকার সীমাবদ্ধ করুন, নিরাপদ ফাইলের নাম তৈরি করুন এবং ফাইলগুলিকে ক্লাউড স্টোরেজে বা ওয়েব রুটের বাইরে সংরক্ষণ করুন৷ সঠিকভাবে আপলোড করা মানে সুবিধা, কর্মক্ষমতা এবং নিরাপত্তার ভারসাম্য বজায় রাখা — সঠিক বৈধতা সহ সরাসরি-টু-ক্লাউড হল বেশিরভাগ অ্যাপ্লিকেশনের জন্য আধুনিক সেরা অনুশীলন।
🔗 Share this article
✍️ Leave a Comment