Add thumbnail file creation
This commit is contained in:
parent
e5416aff88
commit
14312cb5c6
@ -3,131 +3,141 @@ using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using MyDarling.Models;
|
||||
using MyDarling.Services;
|
||||
|
||||
namespace MyDarling.Controllers
|
||||
{
|
||||
[Authorize]
|
||||
public class ProductsController : Controller
|
||||
{
|
||||
private DataContext context;
|
||||
private IWebHostEnvironment environment;
|
||||
[Authorize]
|
||||
public class ProductsController : Controller
|
||||
{
|
||||
private DataContext context;
|
||||
private IWebHostEnvironment environment;
|
||||
private IImageResizer resizer;
|
||||
|
||||
public ProductsController(DataContext context, IWebHostEnvironment environment)
|
||||
{
|
||||
this.environment = environment;
|
||||
this.context = context;
|
||||
}
|
||||
public ProductsController(DataContext context, IImageResizer resizer, IWebHostEnvironment environment)
|
||||
{
|
||||
this.environment = environment;
|
||||
this.context = context;
|
||||
this.resizer = resizer;
|
||||
}
|
||||
|
||||
public IActionResult Index()
|
||||
{
|
||||
return View(context.Products.Include(b => b.Figures));
|
||||
}
|
||||
public IActionResult Index()
|
||||
{
|
||||
return View(context.Products.Include(b => b.Figures));
|
||||
}
|
||||
|
||||
public IActionResult Create()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
public IActionResult Create()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> Create([Bind] Product bundle)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
await context.Products.AddAsync(bundle);
|
||||
context.SaveChanges();
|
||||
return RedirectToAction(nameof(Index));
|
||||
}
|
||||
}
|
||||
catch (DataException)
|
||||
{
|
||||
ModelState.AddModelError("", "Unable to save changes");
|
||||
}
|
||||
return View(bundle);
|
||||
}
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> Create([Bind] Product bundle)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
await context.Products.AddAsync(bundle);
|
||||
context.SaveChanges();
|
||||
return RedirectToAction(nameof(Index));
|
||||
}
|
||||
}
|
||||
catch (DataException)
|
||||
{
|
||||
ModelState.AddModelError("", "Unable to save changes");
|
||||
}
|
||||
return View(bundle);
|
||||
}
|
||||
|
||||
public async Task<IActionResult> Details(string id)
|
||||
{
|
||||
return View(await context.Products.Include(b => b.Figures).Where(b => b.Id.Equals(id)).FirstOrDefaultAsync());
|
||||
}
|
||||
public async Task<IActionResult> Details(string id)
|
||||
{
|
||||
return View(await context.Products.Include(b => b.Figures).Where(b => b.Id.Equals(id)).FirstOrDefaultAsync());
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> Edit(string id)
|
||||
{
|
||||
if (string.IsNullOrEmpty(id))
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> Edit(string id)
|
||||
{
|
||||
if (string.IsNullOrEmpty(id))
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var product = await context.Products.FindAsync(id);
|
||||
if (product == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
var product = await context.Products.FindAsync(id);
|
||||
if (product == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var file = Request.Form.Files.FirstOrDefault();
|
||||
var file = Request.Form.Files.FirstOrDefault();
|
||||
string fullPath = string.Empty;
|
||||
|
||||
if (await TryUpdateModelAsync<Product>(
|
||||
product,
|
||||
"",
|
||||
b => b.Name, b => b.Description, b => b.Figures, b => b.Price))
|
||||
{
|
||||
if (file != null)
|
||||
{
|
||||
var newFigure = new Figure(string.Empty, product.Id);
|
||||
product.Figures.Add(newFigure);
|
||||
string filePath = $"/Content/{product.Id}/{newFigure.Id}.jpg";
|
||||
var savePath = environment.WebRootPath + "/Content/" + product.Id + "/";
|
||||
if (!Directory.Exists(savePath))
|
||||
{
|
||||
Directory.CreateDirectory(savePath);
|
||||
}
|
||||
using var fileStream = new FileStream(environment.WebRootPath + filePath, FileMode.Create);
|
||||
await file.CopyToAsync(fileStream);
|
||||
}
|
||||
if (await TryUpdateModelAsync<Product>(
|
||||
product,
|
||||
"",
|
||||
b => b.Name, b => b.Description, b => b.Figures, b => b.Price))
|
||||
{
|
||||
if (file != null)
|
||||
{
|
||||
var newFigure = new Figure(string.Empty, product.Id);
|
||||
product.Figures.Add(newFigure);
|
||||
string filePath = $"/Content/{product.Id}/{newFigure.Id}.jpg";
|
||||
string directoryPath = environment.WebRootPath + "/Content/" + product.Id + "/";
|
||||
fullPath = environment.WebRootPath + filePath;
|
||||
if (!Directory.Exists(directoryPath))
|
||||
{
|
||||
Directory.CreateDirectory(directoryPath);
|
||||
}
|
||||
using var fileStream = new FileStream(fullPath, FileMode.Create);
|
||||
await file.CopyToAsync(fileStream);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await context.SaveChangesAsync();
|
||||
if (!string.IsNullOrEmpty(fullPath))
|
||||
{
|
||||
resizer.CreateThumbnail(fullPath);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await context.SaveChangesAsync();
|
||||
return RedirectToAction("Details", "Products", new { Id = product?.Id});
|
||||
}
|
||||
}
|
||||
|
||||
catch (System.Exception)
|
||||
{
|
||||
ModelState.AddModelError("", "Unable to save changes");
|
||||
}
|
||||
}
|
||||
return View(product);
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
ModelState.AddModelError("", "Unable to save changes");
|
||||
}
|
||||
}
|
||||
return View(product);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> Delete(string id)
|
||||
{
|
||||
var productToDelete = await context.Products.FindAsync(id);
|
||||
if (productToDelete == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> Delete(string id)
|
||||
{
|
||||
var productToDelete = await context.Products.FindAsync(id);
|
||||
if (productToDelete == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var bundleDirPath = String.Concat(environment.WebRootPath,
|
||||
"/Content/",
|
||||
productToDelete.Id);
|
||||
try
|
||||
{
|
||||
var bundleDirPath = String.Concat(environment.WebRootPath,
|
||||
"/Content/",
|
||||
productToDelete.Id);
|
||||
|
||||
if (Directory.Exists(bundleDirPath))
|
||||
{
|
||||
Directory.Delete(bundleDirPath, true);
|
||||
}
|
||||
context.Products.Remove(productToDelete);
|
||||
await context.SaveChangesAsync();
|
||||
return RedirectToAction(nameof(Index));
|
||||
}
|
||||
catch (DbUpdateException)
|
||||
{
|
||||
return RedirectToAction(nameof(Delete), new { id = id, saveChangesError = true });
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Directory.Exists(bundleDirPath))
|
||||
{
|
||||
Directory.Delete(bundleDirPath, true);
|
||||
}
|
||||
context.Products.Remove(productToDelete);
|
||||
await context.SaveChangesAsync();
|
||||
return RedirectToAction(nameof(Index));
|
||||
}
|
||||
catch (DbUpdateException)
|
||||
{
|
||||
return RedirectToAction(nameof(Delete), new { id = id, saveChangesError = true });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -13,6 +13,7 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
|
||||
<PackageReference Include="SkiaSharp" Version="2.88.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -1,7 +1,9 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using MyDarling.Models;
|
||||
using MyDarling.Services;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
builder.Services.AddDbContext<DataContext>(opts =>
|
||||
@ -25,6 +27,7 @@ builder.Services.Configure<IdentityOptions>( opts =>
|
||||
opts.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz";
|
||||
});
|
||||
|
||||
builder.Services.AddTransient<IImageResizer, ImageResizer>();
|
||||
builder.Services.AddControllersWithViews();
|
||||
builder.Services.AddRazorPages();
|
||||
|
||||
|
8
Services/IImageResizer.cs
Normal file
8
Services/IImageResizer.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace MyDarling.Services
|
||||
{
|
||||
public interface IImageResizer
|
||||
{
|
||||
public void CreateThumbnail(string filePath);
|
||||
public void DownsizeImage(string filePath);
|
||||
}
|
||||
}
|
43
Services/ImageResizer.cs
Normal file
43
Services/ImageResizer.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using SkiaSharp;
|
||||
|
||||
namespace MyDarling.Services
|
||||
{
|
||||
public class ImageResizer : IImageResizer
|
||||
{
|
||||
const int size = 400;
|
||||
const int quality = 75;
|
||||
public void CreateThumbnail(string inputPath)
|
||||
{
|
||||
using var input = File.OpenRead(inputPath);
|
||||
using var inputStream = new SKManagedStream(input);
|
||||
using var original = SKBitmap.Decode(inputStream);
|
||||
|
||||
int width, height;
|
||||
if (original.Width > original.Height)
|
||||
{
|
||||
width = size;
|
||||
height = original.Height * size / original.Width;
|
||||
}
|
||||
else
|
||||
{
|
||||
width = original.Width * size / original.Height;
|
||||
height = size;
|
||||
}
|
||||
|
||||
using var resized = original.Resize(new SKImageInfo(width, height), SKFilterQuality.High);
|
||||
if (resized == null) return;
|
||||
|
||||
using var image = SKImage.FromBitmap(resized);
|
||||
var outputPath = Path.GetDirectoryName(inputPath) + "\\" +
|
||||
Path.GetFileNameWithoutExtension(inputPath) + "_thumb.jpg";
|
||||
using var output = File.OpenWrite(outputPath);
|
||||
|
||||
image.Encode(SKEncodedImageFormat.Jpeg, quality).SaveTo(output);
|
||||
}
|
||||
|
||||
public void DownsizeImage(string filePath)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user