ভালো প্রশ্ন করেছো! আমি ধাপে ধাপে একদম সহজ ভাষায় বুঝিয়ে দিচ্ছি। 😊
📌 URL.createObjectURL() কী?
✅ এটা Browser এর built-in API → মানে Browser (Chrome, Firefox, Edge) নিজেরা এটা দেয়। ✅ এটা JavaScript এর part না, কিন্তু Web API হিসেবে Browser expose করে। ✅ তুমি import করতে হবে না → Browser এ globally available.
👉 Full নাম: window.URL.createObjectURL()
(কিন্তু window
লিখতে হয় না, সরাসরি URL.createObjectURL()
লিখলেই হয়।)
📌 এটা কেন দরকার?
👉 যখন তুমি কোন Blob বা File (image, video, audio) পাবে, সেটা সরাসরি <img src="..." />
বা <video>
তে দেওয়া যায় না।
কারণ:
- Blob → binary data → এর কোন URL নেই।
- HTML element গুলো URL চায় (https://.... অথবা local কিছু URL)।
এখন URL.createObjectURL(blob)
এই function টা একটা temporary URL বানায় যেটা সেই Blob এর জন্য valid হয়।
👉 এই temporary URL টা browser নিজেই manage করে, example:
blob:http://localhost:3000/2357a99f-8a0b-4e92-8b6d-15c7f3f8f32c
এখন তুমি এই URL টা <img src="...">
এ দিলে browser ঠিকমতো Blob থেকে image দেখাবে।
📌 কবে লাগে?
- যখন তুমি fetch করে blob() নাও, এবং সেটা HTML element এ দেখাতে চাও।
- যখন user file select করে (input type="file"), তুমি preview দেখাতে চাও।
📌 উদাহরণ
১️⃣ Image Fetch করে দেখানো:
fetch("/some-image-url")
.then((response) => response.blob())
.then((blob) => {
const url = URL.createObjectURL(blob);
document.getElementById("img").src = url;
});
২️⃣ User File Upload এর preview:
document.getElementById("fileInput").addEventListener("change", (event) => {
const file = event.target.files[0];
const url = URL.createObjectURL(file);
document.getElementById("imgPreview").src = url;
});
📌 কোন কোন Browser এ কাজ করে?
সব modern Browser:
- Chrome
- Firefox
- Edge
- Safari (IE11 থেকে শুরু করে পুরানো ব্রাউজারও সাপোর্ট করে)
📌 Source কোথা থেকে বুঝবো?
তুমি Browser API docs দেখতে পারো:
👉 MDN Web Docs — URL.createObjectURL() (opens in a new tab)
📌 Summary:
✅ এটা Browser এর Web API → JavaScript এর built-in না → Browser এর global object URL থেকে আসে। ✅ এটা Blob বা File কে HTML element এ দেখানোর জন্য temporary URL বানায়। ✅ খুব কাজে লাগে:
- Image fetch করে দেখাতে
- File upload করে preview দেখাতে
- Video/audio load করাতে
খুব সহজে মনে রাখো:
Blob → URL.createObjectURL(blob) → src তে সেট করো → দেখানো যায়
তুমি চাইলে আমি React এর একটা complete practical example লিখে দেখাতে পারি → যেটাতে Pollinations.ai থেকে image এনে React component এ দেখাবে। চাইলে বলো, লিখে দিচ্ছি 🚀✅। এতে URL.createObjectURL()
খুব clear হয়ে যাবে। ✅✅✅
অবশ্যই! const url = URL.createObjectURL(blob);
এই লাইনটি আপাতদৃষ্টিতে কিছুটা রহস্যময় মনে হতে পারে। চলুন, এটিকে ধাপে ধাপে সহজভাবে ভেঙে বোঝার চেষ্টা করি।
সহজ কথায়: একটি টেম্পোরারি আইডি কার্ড তৈরি
ধরুন, আপনার কাছে একটি ভারী বই আছে (এটি হলো আমাদের blob
অবজেক্ট, যেখানে ছবির সব বাইনারি ডেটা আছে)। আপনি এই বইটি লাইব্রেরির একটি নির্দিষ্ট শেলফে রাখতে চান এবং আপনার বন্ধুকে (যিনি <img>
ট্যাগ) বলতে চান যে বইটি কোথায় আছে।
আপনি যদি বন্ধুকে পুরো বইটি বয়ে নিয়ে দেন, তবে কাজটি কঠিন এবং সময়সাপেক্ষ হবে। এর চেয়ে সহজ উপায় হলো, আপনি লাইব্রেরিয়ানের কাছে গিয়ে বইটির জন্য একটি ক্লেইম টিকেট বা টেম্পোরারি আইডি কার্ড তৈরি করলেন। এই টিকেটে একটি ইউনিক নম্বর লেখা আছে, যা দিয়ে কেবল ওই লাইব্রেরির ভেতরেই বইটি খুঁজে পাওয়া যাবে।
URL.createObjectURL(blob)
ঠিক এই কাজটিই করে। এটি আপনার blob
অবজেক্টের জন্য (ভারী বইটির জন্য) ব্রাউজারের মেমোরিতে একটি অস্থায়ী ও ইউনিক URL (ক্লেইম টিকেট) তৈরি করে দেয়।
বিস্তারিত ব্যাখ্যা
আসুন লাইনটিকে তিনটি অংশে ভাগ করি:
-
blob
(অবজেক্ট):fetch
এবংresponse.blob()
ব্যবহার করে আমরা সার্ভার থেকে আসা ছবির বাইনারি ডেটাগুলোকে একটিblob
অবজেক্টের মধ্যে পেয়েছি। এইblob
অবজেক্টটি এখন আপনার ব্রাউজারের মেমোরিতে আছে।
-
<img>
ট্যাগ (গন্তব্য):- ব্রাউজারে একটি ছবি দেখানোর জন্য আমরা
<img>
ট্যাগ ব্যবহার করি। এই ট্যাগের একটিsrc
অ্যাট্রিবিউট থাকে। - গুরুত্বপূর্ণ বিষয় হলো,
<img>
ট্যাগেরsrc
অ্যাট্রিবিউট একটি URL স্ট্রিং আশা করে (যেমন:"https://example.com/image.png"
)। এটি সরাসরি কোনো জাভাস্ক্রিপ্ট অবজেক্ট (যেমন আমাদেরblob
অবজেক্ট) নিতে পারে না। আপনি<img src={myBlobObject}>
এভাবে কোড লিখতে পারবেন না।
- ব্রাউজারে একটি ছবি দেখানোর জন্য আমরা
-
URL.createObjectURL()
(সেতুবন্ধন বা ব্রিজ):- এখানেই
URL.createObjectURL()
এর জাদু। এটি মেমোরিতে থাকাblob
অবজেক্ট এবং<img>
ট্যাগের মধ্যে একটি সেতুবন্ধন তৈরি করে। - যখন আপনি
URL.createObjectURL(blob)
কল করেন, ব্রাউজার নিচের কাজগুলো করে:- এটি মেমোরিতে থাকা আপনার
blob
অবজেক্টের জন্য একটি বিশেষ ধরনের রেফারেন্স বা পয়েন্টার তৈরি করে। - এই রেফারেন্সটিকে একটি ইউনিক URL স্ট্রিং হিসেবে প্রকাশ করে। এই URL-টি দেখতে সাধারণত এমন হয়:
blob:http://localhost:5173/a1b2c3d4-e5f6...
- লক্ষ্য করুন, এটি সাধারণ
http://
URL নয়, এর শুরুতেblob:
লেখা থাকে। এর মানে হলো, এই URL-টি কোনো ইন্টারনেট ঠিকানাকে নির্দেশ করছে না, বরং এই ব্রাউজারের অভ্যন্তরীণ মেমোরির একটি নির্দিষ্ট ডেটাকে নির্দেশ করছে।
- এটি মেমোরিতে থাকা আপনার
- এখানেই
এখন, যখন আপনি এই সদ্য তৈরি হওয়া URL-টিকে একটি <img>
ট্যাগের src
-এ বসিয়ে দেন, ব্রাউজার বুঝতে পারে যে তাকে নেটওয়ার্ক থেকে নতুন করে কিছু ডাউনলোড করতে হবে না। সে blob:
URL-টি দেখে তার নিজের মেমোরিতে থাকা ঐ নির্দিষ্ট blob
অবজেক্টটিকে খুঁজে বের করে এবং ছবিটি স্ক্রিনে প্রদর্শন করে।
আমাদের এটা কেন দরকার?
- দক্ষতা (Efficiency): যেহেতু ছবির ডেটা অলরেডি ব্রাউজারের মেমোরিতে আছে, তাই নতুন করে ডেটা ডাউনলোড বা প্রসেস করার প্রয়োজন হয় না। এটি খুব দ্রুত এবং পারফরম্যান্সের জন্য খুবই ভালো।
- প্রয়োজনীয়তা (Necessity):
<img>
ট্যাগ সরাসরি জাভাস্ক্রিপ্টblob
অবজেক্ট বুঝতে পারে না, তাই তাকে একটি URL ফরম্যাটেই ঠিকানা দিতে হয়।createObjectURL
ঠিক সেই কাজটিই করে।
গুরুত্বপূর্ণ বিষয়: মেমোরি ম্যানেজমেন্ট
URL.createObjectURL()
দিয়ে তৈরি করা URL-টি মেমোরিতে জায়গা দখল করে রাখে। কাজটি শেষ হয়ে গেলে বা ছবিটি আর প্রয়োজন না হলে, এই মেমোরি খালি করে দেওয়া একটি ভালো অভ্যাস। এর জন্য URL.revokeObjectURL(url)
ব্যবহার করা হয়।
React-এ useEffect
হুকের ক্লিন-আপ ফাংশনে এই কাজটি করা হয়, যাতে কম্পোনেন্টটি আনমাউন্ট (স্ক্রিন থেকে সরে গেলে) হওয়ার সাথে সাথে মেমোরিটি মুক্ত হয়ে যায়।
useEffect(() => {
// ... fetch এবং createObjectURL এর কোড
const url = URL.createObjectURL(blob);
setImageUrl(url);
// ক্লিন-আপ ফাংশন
return () => {
URL.revokeObjectURL(url); // কম্পোনেন্ট আনমাউন্ট হলে URL টি মুক্ত করে দাও
};
}, []);
সারসংক্ষেপ
URL.createObjectURL(blob)
হলো ব্রাউজারের মেমোরিতে থাকা একটি বাইনারি ডেটা blob
-কে দেখানোর জন্য একটি অস্থায়ী, অভ্যন্তরীণ এবং ইউনিক URL তৈরি করার একটি পদ্ধতি, যা <img>
বা <video>
ট্যাগের src
অ্যাট্রিবিউটে ব্যবহার করা যায়।