دراین نوشتهی علمی روش پیادهسازی عملیات CRUD یعنی Create (اضافه کردن طراحی اپلیکیشن در مشهد دادهها رایا پارس در مقر داده)، Read (اخذ داده از مقر داده)، Update (آپ تو دیت داده در مقر داده)، Delete (حذف داده از مقر داده) و روش application آپلود و دانلود فولدر با به کارگیری از Entity Framework Core و ASP.NET Core را گستردن می دهیم. همینطور طرز ساخت و ساز فولدر، روش رابطه مسیر به فایل و جایی که فولدرها ذخیره میگردند (در پوشه wwwroot) را ذکر می کنیم.
معرفی
ما قصد داریم یک اپ خرد و بی آلایش net core 2.0. را انجام کنیم. ما یک مخاطب را اضافه میکنیم و با آپلود پوشه تصویری آن را بازنویسی میکنیم. تصویر را در فایل wwwroot در پایین فایل “UserFiles” اضافه می کنیم. نظارت می کنیم آیا این فایل از پیشین تاسیس شده است یا این که خیر، آنگاه آغاز آن را ساختوساز کرده و بعداز آن یک فایل دیگر به اسم id این استفاده کننده اضافه خوا هیم کرد، و پوشه داخلی آن را به اسم “images” اضافه میکنیم، جایی که پوشههای تصویری ما آپلود می شوند. آغاز نظارت می کنیم ببینیم آیا مجموع فولدرهای بالا اینک وجود داراهستند یا این که خیر.
ما آنهارا آغاز تولید کرده و بعد از آن پوشه را آپلود می کنیم. در صورتیکه یک استفاده کننده آن را حذف نماید، پوشه مهم، زیرفولدرها و همینطور پوشهها حذف خواهند شد.
برای تعقیب کردن این فرایند در ویژوال استودیو 2017 این فرآیند را ایفا می دهیم:
File --> New --> Project (1
2) گزینش ASP.Net Core Web Application
3) تهیه و تنظیم اسم و وضعیت
4) گزینش پوسته Web Application (Model – View – Controller) در ورقه آینده و تعیین No Authentication و کلیک روی OK
5) درحال حاضر می بایست تعدادی پکیج ما یحتاج NuGet را اضافه کنیم:
Tools --> NuGet Package Manager --> Package Manager Console.1
2. اجرای Install-Package Microsoft.EntityFrameworkCore.SqlServer
3. برای ابزارهای Entity Framework Core تا پاپگاه دادهای را از سبک EF Core خویش ساخت و ساز فرمائید
4. اجرای Install-Package Microsoft.EntityFrameworkCore.Tools
5. و برای ابزارهای اسکفلدینگ ASP.NET Core برای ساختوساز کنترلرها و ویوها
6. اجرای Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design
کلاس “User.cs” را به طور اوامر پایین اضافه نمایید:
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Company { get; set; }
public string Introduction { get; set; }
}
کلاس “DataAccess.cs” را همچون امرها پایین اضافه نمائید:
public class DataAccess : DbContext
{
public DataAccess(DbContextOptions options)
: base(options)
{ }
public DbSet User { get; set; }
}
برای اینکه کنترلرهای MVC ما از DataAccess استعمال نمایند، ما آن را تحت عنوان خدمت تصویب میکنیم.
کد ذیل را به پوشه Startup.cs اضافه فرمایید:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Custom code for Data Access
var connection = @\"Data Source=ATIQ;Initial Catalog=UserDB;Integrated Security=False; Persist Security Info=False;User ID=sa;Password=*****\";
services.AddDbContext(options => options.UseSqlServer(connection));
}
دو using را به پوشه Startup.cs اضافه نمایید:
using UserDemo.Models;
using Microsoft.EntityFrameworkCore;
در Tools --> NuGet Package Manager --> Package Manager Console، دو امر را اضافه نمایید:
Add-Migration InitialCreate
Update-Database
این فرمان مقر دادهای را با به کارگیری از Entity Framework Core ساخت مینماید.
روی Controllers راست کلیک کرده، Add Controller را زده و “MVC Controller with Views using Entity Framework” را گزینش کرده و نامی برای کنترلر بگذارید.
این فعالیت کنترلری را با کل ویوهای CRUD در فایل views برای آن کنترلر، که ما آن را \"Users\" نامیدیم، ساخت و ساز مینماید.
ما تغییرات کوچکی را باطن این ویوها تحت عنوان فولدرهای منبع مربوطه ساختوساز خواهیم کرد. کدهایی را داخل Views/Users/Edit.cshtml اضافه نمائید.
User Image
\"@Model.Name\"
@if (!string.IsNullOrEmpty(ViewBag.FileName))
{
Download
}
\"Upload\"
و در فولدر UsersController.cs کدهای سفارشی پایین را اضافه نمائید:
public async Task Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var user = await _context.User.SingleOrDefaultAsync(m => m.UserId == id);
if (user == null)
{
return NotFound();
}
string webRoot = _env.WebRootPath;
string img_p = \"\";
string fileName = \"\";
if (System.IO.Directory.Exists(webRoot + \"/UserFiles/\" + user.UserId.ToString() + \"/Image/\"))
{
string[] strfiles = Directory.GetFiles(webRoot + \"/UserFiles/\" + user.UserId.ToString() + \"/Image/\", \"*.*\");
if (strfiles.Length > 0)
{
for (int i = 0; i < strfiles.Length; i++)
{
fileName = Path.GetFileName(strfiles[i]);
string _CurrentFile = strfiles[i].ToString();
if (System.IO.File.Exists(_CurrentFile))
{
string tempFileURL = \"/UserFiles/\" + user.UserId.ToString() + \"/Image/\" + Path.GetFileName(_CurrentFile);
img_p = tempFileURL;
}
}
}
}
if (!string.IsNullOrEmpty(img_p))
{
ViewBag.ImgPath = Convert.ToString(img_p);
ViewBag.FileName = Convert.ToString(fileName);
}
else
ViewBag.ImgPath = \"/Images/default.jpg\";
return View(user);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Edit(int id, [Bind(\"UserId,Name,Email,Password,Introduction\")] User user)
{
if (id != user.UserId)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(user);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(user.UserId))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(user);
}
و کدی را برای آپلود پوشه اضافه فرمایید:
[HttpPost]
public async Task UploadImage(IFormCollection form)
{
if (form.Files == null || form.Files[0].Length == 0)
return RedirectToAction(\"Edit\", new { id = Convert.ToString(form[\"UserId\"]) });
var webRoot = _env.WebRootPath;
string userId = Convert.ToString(form[\"UserId\"]);
if (!System.IO.Directory.Exists(webRoot + \"/UserFiles/\"))
{
System.IO.Directory.CreateDirectory(webRoot + \"/UserFiles/\");
}
if (!System.IO.Directory.Exists(webRoot + \"/UserFiles/\" + userId + \"/Image/\"))
{
System.IO.Directory.CreateDirectory(webRoot + \"/UserFiles/\" + userId + \"/Image/\");
}
//Delete existing files first and then add new file
DeleteFiles(userId);
var path = Path.Combine(
Directory.GetCurrentDirectory(), \"wwwroot\" + \"/UserFiles/\" + userId + \"/Image/\",
form.Files[0].FileName);
using (var stream = new FileStream(path, FileMode.Create))
{
await form.Files[0].CopyToAsync(stream);
}
return RedirectToAction(\"Edit\", new { id = Convert.ToString(form[\"UserId\"]) });
}
و همینطور کد مرتبط با دانلود را:
public async Task Download(string img, string userId)
{
string filename = img;
if (filename == null)
return Content(\"filename not present\");
var path = Path.Combine(
Directory.GetCurrentDirectory(),
\"wwwroot\" + \"/UserFiles/\" + userId + \"/Image/\", filename);
var memory = new MemoryStream();
using (var stream = new FileStream(path, FileMode.Open))
{
await stream.CopyToAsync(memory);
}
memory.Position = 0;
return File(memory, GetContentType(path), Path.GetFileName(path));
}
private string GetContentType(string path)
{
var types = GetMimeTypes();
var ext = Path.GetExtension(path).ToLowerInvariant();
return types[ext];
}
private Dictionary GetMimeTypes()
{
return new Dictionary
{
{\".png\", \"image/png\"},
{\".jpg\", \"image/jpeg\"},
{\".jpeg\", \"image/jpeg\"},
{\".gif\", \"image/gif\"}
};
}
در اینجا مباحث جدیدی را در ارتباط با مپ کردن تصویر با مسیرها و فایلهای root مطرح می کنیم.
آحاد فولدرهای استاتیک (.css, .js and images) به طور پیشفرض در پوشه wwwroot ذخیره گردیدهاند.
ما از \"Request.Files\" به کار گیری می کنیم، هم اکنون ما از \"Request.Form.Files\" برای تصاحب کردن فولدرها از هیبت در کنترلر به کار گیری می کنیم.
)”\"/Server.MapPath(\"~/UserImages\" همینطور به \"var webRoot = _env.WebRootPath;\" تغییر تحول پیدا مینماید، جایی که ما _env را اضافه کردیم مانند:
private readonly DataAccess _context;
private readonly IHostingEnvironment _env;
public UsersController(DataAccess context, IHostingEnvironment env)
{
_context = context;
_env = env;
}
تغییر و تحول دیگری که می بایست به آن دقت گردد این میباشد که کلمه و واژه کلیدی \"HttpFileCollectionBase\" در CORE استعمال نشده میباشد، در ازای ما از \"IFormFileCollection\" برای دریافت کردن پارامترهای تیم فولدرها استعمال می کنیم.
همینطور کلمه و واژه کلیدی \"HttpPostedFileBase\" به \"IFormFile\" برای به دست آوردن یک فولدر واحد تغییر تحول مینماید.
زمانی که استفاده کننده تک تک فولدرها و زیرفولدرها را حذف مینماید، پوشه تصویر نیز همچون کد تحت حذف می شود:
[HttpPost, ActionName(\"Delete\")]
[ValidateAntiForgeryToken]
public async Task DeleteConfirmed(int id)
{
var user = await _context.User.SingleOrDefaultAsync(m => m.UserId == id);
_context.User.Remove(user);
await _context.SaveChangesAsync();
//Delete User Files as well
var dirPath = Path.Combine(
Directory.GetCurrentDirectory(),
\"wwwroot\" + \"/UserFiles/\" + Convert.ToString(id) + \"/\");
Directory.Delete(dirPath,true);
return RedirectToAction(nameof(Index));
}
ممکن میباشد توضیحات بی نقص نباشند البته می توانید کد را با یه خرده سعی به خیر فهم و شعور نمایید.
حرف اخر
این یک نرمافزار ماهر وجود ندارد بلکه صرفا یک اپلیکیشن مقدماتی و آموزشیبرای Asp.Net Core 2.0 میباشد. کل کدهای مایحتاج مرتبط با فولدرها درین نوشته ی علمی مو جود میباشند،صرفا آنانرا در روت پروژه خویش اسکن پیس نمایید.لطفا connection stringمربوط به Sql Server خودتان را در پوشه Sratrup.csتغییر دهید. همچنینnamespacesرا با اعتنا به اسم پروژه خویش تغییرو تحول دهید.