বড় ফাইল ট্রান্সফার এমন একটি প্রক্রিয়া যেখানে ফাইলের বড় আকারের ডেটা ছোট ছোট অংশে (চাঙ্ক) ভাগ করে তা ট্রান্সফার করা হয়। এই টেকনিকটি বিশেষভাবে ব্যবহার করা হয় যখন ফাইলের আকার খুব বড় হয় এবং একবারে পুরো ফাইল ট্রান্সফার করা সম্ভব নয় বা নেটওয়ার্কের সমস্যা হতে পারে। চাঙ্কিং টেকনিকের মাধ্যমে ফাইলটি ছোট ছোট অংশে ভাগ হয়ে প্রতিটি অংশ আলাদাভাবে পাঠানো হয় এবং শেষে সেগুলোকে পুনরায় একত্রিত করা হয়।
এখানে চাঙ্কিং টেকনিক এবং বড় ফাইল ট্রান্সফার নিয়ে একটি Node.js এবং Socket.IO ব্যবহার করে উদাহরণ দেয়া হচ্ছে।
চাঙ্কিং প্রক্রিয়া: মৌলিক ধারণা
- ফাইলটিকে ছোট চাঙ্কে ভাগ করা: বড় ফাইলটিকে ছোট ছোট অংশে ভাগ করা হয় (যেমন, ১ এমবি চাঙ্ক)।
- প্রতিটি চাঙ্ক আলাদাভাবে ট্রান্সফার করা: চাঙ্কগুলো সার্ভার বা ক্লায়েন্টে একে একে পাঠানো হয়।
- ফাইলটিকে পুনরায় একত্রিত করা: সব চাঙ্ক ট্রান্সফার হওয়ার পর, সেগুলো পুনরায় একত্রিত করে মূল ফাইলটি তৈরি করা হয়।
Node.js এবং Socket.IO দিয়ে বড় ফাইল ট্রান্সফারের উদাহরণ
Step 1: ডিপেনডেন্সি ইনস্টল করা
প্রথমে Node.js এবং Socket.IO ইনস্টল করা হবে। নিচে কমান্ডগুলো দেয়া হলো:
Node.js প্রজেক্ট তৈরি করা:
mkdir chat-app cd chat-app npm init -yExpress এবং Socket.IO ইনস্টল করা:
npm install express socket.io fs
Step 2: Server-Side কোড (Node.js + Socket.IO)
এই সার্ভারে আমরা Socket.IO এর মাধ্যমে ফাইলের চাঙ্কগুলো গ্রহণ করব এবং প্রতিটি চাঙ্ককে একটি অস্থায়ী ফাইলে অ্যাপেন্ড (যৌক্তিকভাবে যোগ) করব।
server.js:
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const fs = require('fs');
const path = require('path');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
// ফাইল রিসিভ করার লোকেশন
const filePath = path.join(__dirname, 'receivedFile.txt');
// চাঙ্কড ফাইল আপলোড হ্যান্ডলিং
io.on('connection', (socket) => {
console.log('A user connected');
// ফাইলটি রিসেট করা (আনেক সময় ফাইলটি তৈরি বা রিপ্লেস করা হয়)
fs.truncate(filePath, 0, (err) => {
if (err) throw err;
console.log('File reset');
});
// চাঙ্ক রিসিভ করা
socket.on('file-chunk', (chunk, index) => {
console.log(`Received chunk #${index}`);
// চাঙ্কটি ফাইলে অ্যাপেন্ড করা
fs.appendFile(filePath, chunk, (err) => {
if (err) throw err;
console.log(`Chunk #${index} appended successfully`);
});
});
// ফাইল ট্রান্সফার শেষ হলে
socket.on('transfer-complete', () => {
console.log('File transfer complete');
socket.emit('message', 'File received successfully');
});
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});Step 3: Client-Side কোড (HTML + JavaScript)
এখানে ক্লায়েন্টে একটি ফাইল সিলেক্ট করার ইনপুট ফিল্ড থাকবে। ফাইলটি চাঙ্ক করে সার্ভারে পাঠানো হবে।
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Large File Transfer with Chunking</title>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io('http://localhost:3000');
// ফাইল সিলেক্ট করার ফাংশন
function uploadFile(event) {
const file = event.target.files[0];
const chunkSize = 1024 * 1024; // 1MB চাঙ্ক
let offset = 0;
const totalChunks = Math.ceil(file.size / chunkSize);
// চাঙ্ক পাঠানো
function sendNextChunk() {
const reader = new FileReader();
const slice = file.slice(offset, offset + chunkSize);
reader.onload = () => {
socket.emit('file-chunk', reader.result, Math.floor(offset / chunkSize) + 1);
offset += chunkSize;
if (offset < file.size) {
sendNextChunk();
} else {
socket.emit('transfer-complete');
}
};
reader.readAsArrayBuffer(slice);
}
sendNextChunk();
}
// ফাইল আপলোড হবার পর সার্ভার থেকে বার্তা
socket.on('message', (message) => {
alert(message);
});
// ফাইল ইনপুট ইভেন্ট
document.getElementById('file-input').addEventListener('change', uploadFile);
</script>
</head>
<body>
<h2>Upload a Large File</h2>
<input type="file" id="file-input">
</body>
</html>Step 4: Application Run করা
সার্ভার চালু করুন:
node server.js- ক্লায়েন্টে ফাইল আপলোড করুন:
- ব্রাউজারে গিয়ে
index.htmlফাইলটি ওপেন করুন এবং একটি ফাইল সিলেক্ট করে আপলোড করুন।
- ব্রাউজারে গিয়ে
How It Works:
- Client Side:
- ব্যবহারকারী একটি ফাইল সিলেক্ট করেন, তারপর ফাইলটি 1MB চাঙ্কে ভাগ হয়ে সার্ভারে পাঠানো হয়।
- প্রতি চাঙ্ক পাঠানোর পর, সার্ভার সেই চাঙ্কটি ফাইলে অ্যাপেন্ড করে এবং পরবর্তী চাঙ্ক পাঠাতে অপেক্ষা করে।
- Server Side:
- সার্ভার ফাইলের চাঙ্কগুলো গ্রহণ করে এবং সেগুলোকে পুনরায় একত্রিত করে মূল ফাইলে তৈরি করে। যখন সব চাঙ্ক আসে, সার্ভার একটি কনফার্মেশন বার্তা পাঠায়।
Advantages of Chunking for Large File Transfers
- Error Recovery:
- যদি কোনো চাঙ্ক পাঠানোর সময় সমস্যা হয়, তখন শুধুমাত্র সেই চাঙ্কটি পুনরায় পাঠাতে হবে, পুরো ফাইল নয়।
- Memory Optimization:
- বড় ফাইলের পুরো কনটেন্ট একসাথে মেমোরিতে রাখতে না পারলেও, চাঙ্ক করে ট্রান্সফার করার কারণে কম মেমোরি ব্যবহার হয়।
- Network Efficiency:
- ছোট ছোট অংশ পাঠানোর মাধ্যমে নেটওয়ার্ক বেন্ডউইথের বেশি ব্যবহার করা যায় এবং ট্রান্সফার পারফরম্যান্স বাড়ানো যায়।
- Parallelization:
- একাধিক চাঙ্ককে একসাথে (প্যারালাল) পাঠানো বা গ্রহণ করা সম্ভব, যা দ্রুত ডেটা ট্রান্সফার নিশ্চিত করে।
Conclusion
এটি একটি বেসিক উদাহরণ ছিল যেখানে Node.js এবং Socket.IO ব্যবহার করে বড় ফাইল চাঙ্কিং এবং ট্রান্সফারের প্রক্রিয়া দেখানো হয়েছে। এই টেকনিকটি real-time file syncing, file sharing, এবং streaming এর মতো অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত কার্যকরী।
Read more