PictureApp.zip
حجم:
23.4M
اینکه دو پروژهی جدا (CRUD تصویر و CRUD فایل) رو در یک پروژه ترکیب کردی، یعنی الان دو کنترلر داری که هر کدوم مسئولیت متفاوتی دارن. بذار مرحلهبهمرحله توضیح بدم:
پروژه ASP.Net Core MVC (وب و سی شارپ)
اینکه دو پروژهی جدا (CRUD تصویر و CRUD فایل) رو در یک پروژه ترکیب کردی، یعنی الان دو کنترلر داری که
## 🔹 کنترلر اول: PicturesController
این کنترلر مخصوص مدیریت تصاویر هست:
- Index
→ لیست همه تصاویر ذخیرهشده در دیتابیس رو نمایش میده.
- Create (GET/POST)
→ کاربر میتونه یک تصویر آپلود کنه. تصویر در پوشهی
wwwroot/imagesذخیره میشه و مسیرش در دیتابیس ثبت میشه. - Edit (GET/POST) → کاربر میتونه توضیحات تصویر رو تغییر بده یا تصویر جدید جایگزین کنه. اگر تصویر جدید آپلود بشه، تصویر قبلی حذف میشه. - Delete → تصویر از دیتابیس و فایل فیزیکی از پوشه حذف میشه. - نمایش در ویو → تصاویر با
<img src="~/images/...">نمایش داده میشن. 👉 این کنترلر بیشتر برای گالری عکس، پروفایل کاربری یا نمایش بصری استفاده میشه. --- ## 🔹 کنترلر دوم: DocumentsController این کنترلر مخصوص مدیریت فایلهای عمومی (PDF، Word، ZIP و …) هست: - Index → لیست همه فایلها رو نمایش میده همراه با توضیحات. - Create (GET/POST) → کاربر میتونه یک فایل آپلود کنه. فایل در پوشهی
wwwroot/filesذخیره میشه و نام اصلی + مسیر ذخیره در دیتابیس ثبت میشه. - Edit (GET/POST) → کاربر میتونه توضیحات فایل رو تغییر بده یا فایل جدید جایگزین کنه. فایل قبلی حذف و فایل جدید ذخیره میشه. - Download → کاربر میتونه فایل رو دانلود کنه. اینجا کنترلر فایل رو از پوشه میخونه و با متد
File()به کاربر برمیگردونه. - Delete → فایل از دیتابیس و پوشه حذف میشه. 👉 این کنترلر بیشتر برای مدیریت اسناد، فایلهای آموزشی یا دانلودی استفاده میشه. --- ## 🔹 تفاوت اصلی دو کنترلر - PicturesController → تمرکز روی نمایش بصری (
<img>). - DocumentsController → تمرکز روی دانلود فایل (
File()در کنترلر). - هر دو از یک الگو استفاده میکنن: - آپلود → ذخیره در پوشه + ثبت در دیتابیس - ویرایش → تغییر توضیحات یا جایگزینی فایل - حذف → پاک کردن رکورد + فایل فیزیکی --- ## 🎯 جمعبندی الان پروژهات دو بخش داره: - بخش مدیریت تصاویر (نمایش مستقیم در صفحه) - بخش مدیریت فایلها (دانلود توسط کاربر) هر دو کنترلر ساختار مشابه دارن، فقط فرقشون در نوع نمایش خروجی هست: - تصاویر با
<img>نمایش داده میشن. - فایلها با لینک دانلود برگردونده میشن.
// مسیر پوشه لاگها را مشخص میکنیم (داخل wwwroot/logs)
var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "logs");
// اگر پوشه وجود نداشت، ساخته میشود
Directory.CreateDirectory(folderPath);
// نام فایل لاگ را با تاریخ و ساعت جاری میسازیم (هر بار اجرا یک فایل جدید)
var logFilePath = Path.Combine(folderPath, $"eflog_{DateTime.Now:yyyyMMdd_HHmmss}.txt");
// فایل را باز میکنیم با اجازهی اشتراکگذاری (FileShare.ReadWrite)
// تا چند پروسه بتوانند همزمان به آن دسترسی داشته باشند
var fileStream = new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
// یک StreamWriter روی فایل ایجاد میکنیم و AutoFlush را فعال میکنیم
// تا هر خط بلافاصله نوشته شود و نیازی به Close دستی نباشد
var writer = new StreamWriter(fileStream) { AutoFlush = true };
// ثبت DbContext در DI Container (Dependency Injection)
// اینجا EF Core را تنظیم میکنیم تا:
// 1. از ConnectionString موجود در appsettings.json استفاده کند
// 2. SensitiveDataLogging فعال باشد (پارامترهای کوئری هم نمایش داده شوند)
// 3. همهی کوئریها در فایل لاگ نوشته شوند
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
.EnableSensitiveDataLogging()
.LogTo(writer.WriteLine, LogLevel.Information));
و
if (file != null)
{
// مسیر پوشه wwwroot/images
var folder = Path.Combine(_env.WebRootPath, "images");
Directory.CreateDirectory(folder);
// نام فایل یکتا
var fileName = Guid.NewGuid() + Path.GetExtension(file.FileName);
var filePath = Path.Combine(folder, fileName);
// ذخیره فایل
using (var stream = new FileStream(filePath, FileMode.Create))
{
file.CopyTo(stream);
}
// ذخیره رکورد در دیتابیس
var pc = new Picture { FileName = fileName , Description = description};
_db.Pictures.Add(pc);
_db.SaveChanges();
return RedirectToAction("Index");
}
شباهت و تفاوت
این دو قطعه کد از نظر ساختار خیلی شبیه هم هستند، اما از نظر هدف کاملاً متفاوتند. بذار دقیق توضیح بدم:
---
## 🔹 شباهتها
1. ساخت پوشه
هر دو با Directory.CreateDirectory(...) مطمئن میشوند که پوشه وجود دارد و اگر نبود ساخته میشود.
- اولی:
wwwroot/logs- دومی:
wwwroot/images2. ساخت نام فایل یکتا هر دو نام فایل را با Guid.NewGuid() و پسوند مناسب میسازند تا فایلها تکراری نشوند. 3. کار با FileStream هر دو از
FileStreamاستفاده میکنند تا روی فایل بنویسند. - اولی: برای نوشتن لاگها (متن کوئریهای EF Core). - دومی: برای ذخیره کردن محتوای آپلود شده (تصویر). 4. ارتباط با دیتابیس هر دو در نهایت یک رکورد در دیتابیس ثبت میکنند: - اولی: EF Core کوئریها را لاگ میکند. - دومی: مسیر و توضیحات تصویر را ذخیره میکند. --- ## 🔹 تفاوتها 1. هدف اصلی - کد اول: مخصوص لاگنویسی EF Core است. یعنی کوئریهای دیتابیس در فایل متنی ذخیره میشوند. - کد دوم: مخصوص آپلود تصویر است. یعنی فایل واقعی (jpg, png و …) در پوشه ذخیره میشود. 2. نوع داده ورودی - کد اول: هیچ ورودی از کاربر نمیگیرد، خودش فایل لاگ میسازد. - کد دوم: ورودی از کاربر (
IFormFile file) میگیرد و آن را ذخیره میکند. 3. نحوه نوشتن در فایل - کد اول: از
StreamWriterاستفاده میکند تا متن (کوئریها) را خطبهخط بنویسد. - کد دوم: از file.CopyTo(stream) استفاده میکند تا کل محتوای فایل آپلود شده کپی شود. 4. محل استفاده - کد اول: در Program.cs یا هنگام تنظیم DbContext استفاده میشود. - کد دوم: در Controller (اکشن Create) استفاده میشود. 5. نوع خروجی - کد اول: خروجیاش یک فایل متنی لاگ است. - کد دوم: خروجیاش یک فایل تصویر است که بعداً در ویو با
<img>نمایش داده میشود. --- ## 🎯 جمعبندی - شباهتها: ساخت پوشه، نام یکتا، کار با FileStream، ثبت در دیتابیس. - تفاوتها: هدف (لاگنویسی vs آپلود تصویر)، نوع داده (متن vs فایل)، محل استفاده (Program.cs vs Controller)، و نوع خروجی (فایل متنی vs تصویر).
برای اینکه ورودی <input type="file"> فقط فرمتهای تصویر رو قبول کنه، باید از ویژگی accept استفاده کنی. این ویژگی مشخص میکنه چه نوع فایلهایی قابل انتخاب باشن.
---
🔹 نمونه کد HTML
html
<form asp-action="Create" enctype="multipart/form-data" method="post">
<div class="form-group">
<label>انتخاب تصویر</label>
<input type="file" name="file" class="form-control"
accept="image/*" /> <!-- فقط همه فرمتهای تصویر -->
</div>
<div class="form-group">
<label>توضیحات</label>
<input type="text" name="description" class="form-control" />
</div>
<button type="submit" class="btn btn-success">ذخیره</button>
</form>
---
🔹 توضیح
- accept="image/*" → یعنی فقط فایلهایی که نوع MIME آنها تصویر است (jpg, png, gif, bmp, webp, svg و …) قابل انتخاب هستند.
- اگر بخوای دقیقتر باشی و فقط چند فرمت خاص رو قبول کنی، میتونی اینطوری بنویسی:
html
<input type="file" name="file"
accept=".jpg,.jpeg,.png,.gif,.bmp,.webp" />
---
🎯 جمعبندی
- برای همهی فرمتهای تصویر → accept="image/*"
- برای فرمتهای خاص → accept=".jpg,.png,.gif"ImageUrlApp2.zip
حجم:
24.8M
پروژه را جمعه قبل نوشتم
پروژه را تغییر نام دادم و نتوانستم پروژه جدید بسازم چون نیاز به اینترنت داشتم و کتابخانه ها نیاز داشتم
و پروژه دارای
نام
Checkbox
تصویر
قیمت که Fluent api استفاده شده
تاریخ به شمسی و میلادی
که همه از یک جدول دیتابیس ذخیره می شود
این پروژه چون تغییر نام دادم دو تا namespace وجود دارد
به آپارات
https://www.aparat.com/shorts/user/alialirezapanahi/shorts
یا
www.aparat.com/alialirezapanahi
سر بزنید
شرمنده سایت Nuget بالا نمیاد و نمیتوانم کتابخانه های EF Core به پروژه جدید اضافه کنم
پروژه قبلی را اگر تغییر نام دهم دو تا namespace به دست میاد که و اولی نام قبلی که تغییر نمیکنه و تغییر دهم خطا میده و دومی نام پروژه جدید است
سایت خالی nuget بالا می آید ولی برای دانلود کتابخانه زمان زیادی طول میکشه و api.nuget.org درست متصل نیست
Filter App.zip
حجم:
23.3M
با دردسر کتابخانه ها نصب شد هوش مصنوعی من فرق میکند و این پروژه هم فیلتر کردن محصول برای آموزش گذاشتم
نکته: اگر همه آموزش تکراری هستند من را ببخشید و من هنوز کدها را خوب درک نکرده ام و تمرین کنم و به اشتراک بگذارم
نکته دوم : برای تازه وارد که چگونه پروژه را اجرا کنند من یک ویدئو کوتاه درست میکنم تا بتوانند پروژه را اجرا کنند
4.5M حجم رسانه بالاست
مشاهده در ایتا
نحوه استفاده پروژه های من
اول دیتابیس FilterAppDB حذف کردم و نشان دهم که اول در ویژوال استودیو در قسمت Package Manager Console کلمه Update-Database را وارد کنید که یک دیتابیس در sqlserver ساخته شود
نکته: sqlserver من Express است
پروژه ASP.Net Core MVC (وب و سی شارپ)
با دردسر کتابخانه ها نصب شد هوش مصنوعی من فرق میکند و این پروژه هم فیلتر کردن محصول برای آموزش گذاشت
کدی بکار رفته است که تاریخ در فیلتر وارد میکنید تاریخ شمسی را به میلادی تبدیل کرده است
من فراموش کردم دو نوع تاریخ برای نمایش بگذارم و اگر سیستم کامپیوتری میلادی باشد ممکنه از فیلتر درست استفاده نکند من قبلاً در کدهای قبل از دو نوع تاریخ گذاشتم آیا کسانی که مشتاق به کد نویسی داره پروژه من را تکمیل کند
Filter App (2).zip
حجم:
23.3M
یک تغییر کوچک دادم و پروژه را تکمیل کردم و ربطی به سیستم تقویم کامپیوتر نداره