-1
How to save images in repository and recover it through a Path with Asp.Net MVC?
Searching in some places, I found that saving images directly in the database may have a significant loss of performance in the application.
-1
How to save images in repository and recover it through a Path with Asp.Net MVC?
Searching in some places, I found that saving images directly in the database may have a significant loss of performance in the application.
2
Follow code example of an application my ASP.NET MVC5 and the package Imageresizer. I made a model called ProductPicture
where each record keeps the image of a product and its respective thumbnail (thumbnail). Images and thumbnails are stored inside the directory Content
of the site.
Model
public class ProductPicture
{
[Key]
public int ProductPictureId { get; set; }
public int ProductId { get; set; }
[Required]
[Display(Name = "FileName", ResourceType = typeof(Resources.Language))]
public String FileName { get; set; }
public String Thumbnail { get; set; }
[Display(Name = "Product", ResourceType = typeof(Resources.Language))]
public virtual Product Product { get; set; }
[NotMapped]
[Display(Name = "File", ResourceType = typeof(Resources.Language))]
public HttpPostedFileBase File { get; set; }
public ProductPicture() { }
public ProductPicture(int _ProductID) {
this.ProductID = _ProductID;
}
}
Controller
[HttpPost]
[Authorize(Roles = "Uploaders")]
public ActionResult Create(ProductPicture productpicture)
{
// Se foi enviado um arquivo com mais do que 0 bytes:
if (productpicture.File != null && productpicture.File.ContentLength > 0)
{
// Extraindo nome do arquivo
var fileName = Path.GetFileName(productpicture.File.FileName);
var path = Path.Combine(Server.MapPath(imagesDirectory), fileName);
productpicture.File.SaveAs(path);
productpicture.FileName = fileName;
ModelState.Remove("FileName");
// Thumbnails
if (productpicture.File.ContentLength > 0)
{
ImageResizer.ImageJob i = new ImageResizer.ImageJob(productpicture.File,
imagesDirectory + "/Thumbnails/<guid>.<ext>", new ImageResizer.ResizeSettings(
"width=250;height=250;format=jpg;mode=pad"));
i.CreateParentDirectory = true; //Auto-create the uploads directory.
i.Build();
productpicture.Thumbnail = i.FinalPath.Split('\\').Last();
}
}
if (ModelState.IsValid)
{
context.ProductPictures.Add(productpicture);
context.SaveChanges();
return RedirectToAction("Index");
}
// Se a validação falhar e a tela precisar ser recarregada
ViewBag.PossibleProducts = context.Products;
return View(productpicture);
}
View _Createoredit.cshtml
@model MyProject.Models.ProductPicture
@using MyProject.Models
@using MyProject.Resources
<div class="editor-label">
@Html.LabelFor(model => model.File)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.File, new { type = "file" })
@Html.ValidationMessageFor(model => model.File)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Product)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.ProductId, ((IEnumerable<Product>)ViewBag.PossibleProducts).Select(option => new SelectListItem {
Text = (option == null ? "None" : option.Name),
Value = option.ProductId.ToString(),
Selected = (Model != null) && (option.ProductId == Model.ProductId)
}), Language.Choose)
@Html.ValidationMessageFor(model => model.ProductId)
</div>
View Create.cshtml
@model MyProject.Models.ProductPicture
@using MyProject.Resources
@{
ViewBag.Title = Language.Create;
}
<h2>@Language.Create</h2>
@using (Html.BeginForm("Create", "ProductPictures", FormMethod.Post, new { enctype = "multipart/form-data" })) {
@Html.ValidationSummary(true)
<fieldset>
<legend>@Language.ProductPicture</legend>
@Html.Partial("_CreateOrEdit", Model)
<p>
<input type="submit" value="@Language.Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink(Language.BackToList, "Index")
</div>
1
An alternative is to only write the file path to the database (Path). Having in hand the image Path, loaded from the database, it is possible to do as follows:
private static BitmapImage LoadImage(String arquivo)
{
try
{
if (System.IO.File.Exists(arquivo))
{
Uri urlImg = new Uri(arquivo, UriKind.RelativeOrAbsolute);
return new BitmapImage(urlImg);
}
else
return null;
}
catch (Exception)
{
throw;
}
}
Then just call:
LoadImage("..\imagens\xxx.png");
Browser other questions tagged c# asp.net-mvc filing-cabinet
You are not signed in. Login or sign up in order to post.