У меня проблема с загрузкой изображений для приложения MVC в ASP. NET Core, проблема, с которой я сталкиваюсь сейчас, заключается в том, что при отправке формы создания с загрузкой изображения файл не удается чтобы попасть в мою папку wwwroot/images , а также объекты в моем DBInitilizer не могут загрузить стандартное "noimage.jpg" изображение.
Кому уточнить полностью, когда я отправляю форму Создать, объект успешно создан и загружается с "noimage.jpg" изображением по умолчанию.
Вот мой код, пожалуйста, дайте мне знать, если любые дополнительные файлы, которые я должен показать. Заранее спасибо.
Контроллер транспортных средств: ** Управление созданием и загрузкой изображений **
namespace ProjectApplicationX00140684.Controllers
{
public class VehiclesController : Controller
{
private readonly VehicleContext _context;
private readonly IHostingEnvironment hostingEnvironment;
public VehiclesController(VehicleContext context,
IHostingEnvironment hostingEnvironment)
{
_context = context;
this.hostingEnvironment = hostingEnvironment;
}
// GET: Vehicles
public async Task<IActionResult> Index()
{
return View(await _context.Vehicles.ToListAsync());
}
// GET: Vehicles/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var vehicle = await _context.Vehicles
.FirstOrDefaultAsync(m => m.VehicleID == id);
if (vehicle == null)
{
return NotFound();
}
return View(vehicle);
}
// GET: Vehicles/Create
public IActionResult Create()
{
return View();
}
// POST: Vehicles/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("VehicleID,Make,Model,Year")] Vehicle vehicle, VehicleCreateViewModel model)
{
if (ModelState.IsValid)
{
string uniqueFileName = null;
// If the Photo property on the incoming model object is not null, then the user
// has selected an image to upload.
if (model.Photo != null)
{
// The image must be uploaded to the images folder in wwwroot
// To get the path of the wwwroot folder we are using the inject
// HostingEnvironment service provided by ASP.NET Core
string uploadsFolder = Path.Combine(hostingEnvironment.WebRootPath, "images");
// To make sure the file name is unique we are appending a new
// GUID value and and an underscore to the file name
uniqueFileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(model.Photo.FileName);
string filePath = Path.Combine(uploadsFolder, uniqueFileName);
// Use CopyTo() method provided by IFormFile interface to
// copy the file to wwwroot/images folder
model.Photo.CopyTo(new FileStream(filePath, FileMode.Create));
}
_context.Add(vehicle);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(vehicle);
}
// GET: Vehicles/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var vehicle = await _context.Vehicles.FindAsync(id);
if (vehicle == null)
{
return NotFound();
}
return View(vehicle);
}
// POST: Vehicles/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("VehicleID,Make,Model,Year")] Vehicle vehicle)
{
if (id != vehicle.VehicleID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(vehicle);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!VehicleExists(vehicle.VehicleID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(vehicle);
}
// GET: Vehicles/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var vehicle = await _context.Vehicles
.FirstOrDefaultAsync(m => m.VehicleID == id);
if (vehicle == null)
{
return NotFound();
}
return View(vehicle);
}
// POST: Vehicles/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var vehicle = await _context.Vehicles.FindAsync(id);
_context.Vehicles.Remove(vehicle);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
private bool VehicleExists(int id)
{
return _context.Vehicles.Any(e => e.VehicleID == id);
}
}
}
Create.cs html
@model ProjectApplicationX00140684.Models.VehicleCreateViewModel
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>Vehicle</h4>
<hr />
<form enctype="multipart/form-data" asp-controller="vehicles" asp-action="create"
method="post" class="mt-3">
<div class="form-group row">
<label asp-for="Make" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<input asp-for="Make" class="form-control" placeholder="Make">
<span asp-validation-for="Make" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="Model" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<input asp-for="Model" class="form-control" placeholder="Model">
<span asp-validation-for="Model" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="Year" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<input asp-for="Year" class="form-control" placeholder="Year">
<span asp-validation-for="Year" class="text-danger"></span>
</div>
</div>
@* asp-for tag helper is set to "Photo" property. "Photo" property type is IFormFile
so at runtime asp.net core generates file upload control (input type=file)
*@
<div class="form-group row">
<label asp-for="Photo" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<div class="custom-file">
<input asp-for="Photo" class="form-control custom-file-input" />
<label class="custom-file-label">Choose File...</label>
</div>
</div>
</div>
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group row">
<div class="col-sm-10">
<button type="submit" class="btn btn-primary">Create</button>
</div>
</div>
@*This script is required to display the selected file in the file upload element*@
@section Scripts {
<script>
$(document).ready(function () {
$('.custom-file-input').on("change", function () {
var fileName = $(this).val().split("\\").pop();
$(this).next('.custom-file-label').html(fileName);
});
});
</script>
}
</form>
<div>
<a asp-action="Index">Back to List</a>
</div>
Startup.cs
namespace ProjectApplicationX00140684
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<VehicleContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}