হ্যালো হাসিব! আমরা এক্সেল আপলোড ফিচারের শেষ পার্টে চলে এসেছি। আগের দুটি পার্টে আমরা Service Layer-এ ডাটা প্রসেসিং এবং UI (View) তৈরি করেছিলাম। এই লেকচারটিতে মূলত দেখানো হয়েছে যে কীভাবে Controller-এর মাধ্যমে ইউজারের পাঠানো ফাইল রিসিভ করে ভ্যালিডেশন চেক করতে হয় এবং সার্ভিস লেয়ারের সাথে কানেক্ট করতে হয়।

চলো লেকচারটির একটি কুইক সামারি এবং বিস্তারিত আলোচনা শুরু করি।

📝 Lecture Summary at a Glance

  • HTTP POST: ইউজার যখন ফর্মে “Upload” বাটনে ক্লিক করে, তখন ফাইলটি IFormFile হিসেবে POST রিকোয়েস্টের মাধ্যমে Controller-এ আসে।
  • Parameter Binding: HTML ফর্মে <input type="file" name="excelFile"> এর name এবং Controller-এর প্যারামিটার নাম (IFormFile excelFile) হুবহু একই হতে হবে।
  • Validation Check: ফাইল রিসিভ করার পর সেটি ফাঁকা (null বা 0 length) কিনা এবং ফাইলের এক্সটেনশন সঠিক (.xlsx) কিনা, তা ভ্যালিডেট করা হয়।
  • Service Invocation: ভ্যালিডেশন পাস করলে Controller, ICountriesService-এর UploadCountriesFromExcelFile মেথড কল করে এবং সাকসেস/এরর মেসেজ ViewBag এর মাধ্যমে View-তে পাঠায়।

🧠 Comprehensive Breakdown & Deep Dive

১. Controller Action Method তৈরি করা [Importance: 10/10]

  • The “Why”: ইউজারের পাঠানো ফাইলটি প্রসেস করার জন্য Controller-এ একটি [HttpPost] মেথড থাকতে হবে।

💻 Code Implementation (CountriesController.cs):

using Microsoft.AspNetCore.Mvc;
using System.IO;
 
[Route("[controller]")]
public class CountriesController : Controller
{
    private readonly ICountriesService _countriesService;
 
    // Service ইনজেক্ট করা হলো
    public CountriesController(ICountriesService countriesService)
    {
        _countriesService = countriesService;
    }
 
    [HttpGet]
    [Route("[action]")]
    public IActionResult UploadFromExcel()
    {
        return View();
    }
 
    [HttpPost]
    [Route("[action]")]
    public async Task<IActionResult> UploadFromExcel(IFormFile excelFile) // প্যারামিটারের নাম ফর্মের 'name' এর সাথে মিলতে হবে!
    {
        // ... (ভ্যালিডেশন এবং প্রসেসিং লজিক নিচে বিস্তারিত দেওয়া হলো) ...
    }
}
 

২. Server-Side Validation (ফাইল চেকিং) [Importance: 9/10]

  • The “Why”: ইউজার যেকোনো ফালতু ফাইল (যেমন .exe বা .png) বা ফাইল সিলেক্ট না করেই “Upload” এ ক্লিক করতে পারে। এর ফলে সার্ভার ক্র্যাশ করতে পারে। তাই সার্ভার লেভেলে ভ্যালিডেশন মাস্ট!

💻 Code Implementation:

[HttpPost]
[Route("[action]")]
public async Task<IActionResult> UploadFromExcel(IFormFile excelFile)
{
    // ১. ফাইল সিলেক্ট করা হয়েছে কিনা চেক করা
    if (excelFile == null || excelFile.Length == 0)
    {
        ViewBag.ErrorMessage = "Please select an Excel file";
        return View();
    }
 
    // ২. ফাইলের এক্সটেনশন চেক করা (.xlsx কিনা)
    string fileExtension = Path.GetExtension(excelFile.FileName);
    
    // StringComparison.OrdinalIgnoreCase ব্যবহার করা হয়েছে যাতে .XLSX বা .xlsx দুটোই কাজ করে
    if (!fileExtension.Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
    {
        ViewBag.ErrorMessage = "Unsupported file format. Please upload an .xlsx file.";
        return View();
    }
 
    // ৩. ভ্যালিডেশন পাস করলে সার্ভিসের কাছে ফাইল পাঠানো
    int insertedCount = await _countriesService.UploadCountriesFromExcelFile(excelFile);
 
    // ৪. সাকসেস মেসেজ পাঠানো
    ViewBag.Message = $"{insertedCount} countries successfully uploaded.";
    
    return View();
}
 

৩. View-তে মেসেজ দেখানো [Importance: 8/10]

  • The “Why”: ইউজারের ফাইল আপলোড সাকসেসফুল হলো নাকি ফেইল করলো, তা তাকে জানাতে হবে। Controller থেকে পাঠানো ViewBag এর ডাটা আমরা View-তে ডিসপ্লে করবো।

💻 Code Implementation (UploadFromExcel.cshtml):

<div class="text-red">
    @ViewBag.ErrorMessage
</div>
 
<div class="text-green">
    @ViewBag.Message
</div>
 

🚀 Modern Backend Development Tips

১. Avoid ViewBag in Professional Apps: হাসিব, লেকচারার কনসেপ্ট সহজ করার জন্য ViewBag ব্যবহার করেছেন। কিন্তু ক্লিন আর্কিটেকচারে (Clean Architecture) ViewBag বা ViewData ব্যবহার করা চরমভাবে ডিসকারেজ করা হয়, কারণ এগুলো Strongly Typed নয় এবং রানটাইম এরর দিতে পারে। এর চেয়ে TempData (রিডাইরেক্ট করার পর মেসেজ দেখানোর জন্য) অথবা ViewModel ব্যবহার করাটা ইন্ডাস্ট্রির স্ট্যান্ডার্ড।

২. Security Risk (File Validation): শুধুমাত্র এক্সটেনশন (Path.GetExtension) চেক করা সিকিউরিটির জন্য যথেষ্ট নয়। একজন হ্যাকার চাইলে একটি ক্ষতিকর .exe ফাইলের নাম পরিবর্তন করে .xlsx দিয়ে আপলোড করে দিতে পারে। রিয়েল-ওয়ার্ল্ড প্রজেক্টে ফাইলের MIME Type (যেমন excelFile.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") এবং File Signature (Magic Bytes) চেক করা উচিত।

৩. User Experience (Template Download): লেকচারার বলেছেন যে ইউজারকে একটি টেমপ্লেট এক্সেল ফাইল দিতে হবে যাতে সে বুঝতে পারে কোন কলামে কী ডাটা দিতে হবে। প্র্যাক্টিক্যালি, তোমার আপলোড পেজে একটি “Download Excel Template” বাটন থাকা উচিত, যেখান থেকে ইউজার একটি ফাঁকা এক্সেল ফাইল (সঠিক হেডার সহ) ডাউনলোড করে নিতে পারবে।

এই লেকচারের মাধ্যমেই আমাদের Excel এবং File Upload সেকশনটি শেষ হলো। পরবর্তী সেকশনটি Unit Testing (Mocking) নিয়ে হবে বলে লেকচারার আগের একটি লেকচারে বলেছিলেন। তুমি রেডি হলে নতুন ট্রান্সক্রিপ্টটি দিতে পারো!