public async Task <IActionResult> Index() { SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync(); List <News> news = await _websiteDB.News.OrderByDescending(n => n.NewsDate).ToListAsync(); IndexViewModel model = new IndexViewModel() { MaxImageSize = settings.MaxImageSize, ImageResizeQuality = settings.ImageResizeQuality, News = news }; return(View(model)); }
public async Task <IActionResult> ApplySettings(IndexViewModel model) { SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync(); if (ModelState.IsValid) { settings.ImageResizeQuality = model.ImageResizeQuality; settings.MaxImageSize = model.MaxImageSize; _websiteDB.SettingsNews.Update(settings); await _websiteDB.SaveChangesAsync(); } return(RedirectToAction("Index", "News")); }
protected override void OnModelCreating(ModelBuilder modelBuilder) { #region Добавление ролей Role admin = new Role() { Id = Guid.NewGuid(), Name = "admin", Rank = "Глава гильдии", Color = "#ff0000", AccessLevel = 5 }; Role officer = new Role() { Id = Guid.NewGuid(), Name = "elite", Rank = "Элита", Color = "#00ff00", AccessLevel = 4 }; Role member = new Role() { Id = Guid.NewGuid(), Name = "member", Rank = "Боец", Color = "#cdcdcd", AccessLevel = 3 }; Role recruit = new Role() { Id = Guid.NewGuid(), Name = "recruit", Rank = "Рекрут", Color = "#828282", AccessLevel = 2 }; Role user = new Role() { Id = Guid.NewGuid(), Name = "user", Rank = "Мимо крокодил", Color = "#000000", AccessLevel = 1 }; #endregion #region Добавление игровых классов CharacterClass paladin = new CharacterClass() { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_paladin.jpg", ClassName = "Паладин", ClassColor = "#f58cba" }; CharacterClass warrior = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_warrior.jpg", ClassName = "Воин", ClassColor = "#c79c6e" }; CharacterClass hunter = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_hunter.jpg", ClassName = "Охотник", ClassColor = "#abd473" }; CharacterClass shaman = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_shaman.jpg", ClassName = "Шаман", ClassColor = "#0070de" }; CharacterClass rogue = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_rogue.jpg", ClassName = "Разбойник", ClassColor = "#fff569" }; CharacterClass druid = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_druid.jpg", ClassName = "Друид", ClassColor = "#ff7d0a" }; CharacterClass priest = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_priest.jpg", ClassName = "Жрец", ClassColor = "#ffffff" }; CharacterClass mage = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_mage.jpg", ClassName = "Маг", ClassColor = "#69ccf0" }; CharacterClass warlock = new CharacterClass { Id = Guid.NewGuid(), ClassIconPath = "/images/class_icon_warlock.jpg", ClassName = "Чернокнижник", ClassColor = "#9482c9" }; #endregion #region Добавление пользователей User Administrator = new User() { Id = Guid.NewGuid(), Name = "Administrator", Email = "*****@*****.**", Password = "******".HashString(), RegisterDate = DateTime.Now, IsConfirmed = true, RoleId = admin.Id, CharacterClassId = paladin.Id }; User Anonymous = new User() { Id = Guid.NewGuid(), Name = "Anonymous", IsConfirmed = true, RoleId = user.Id, CharacterClassId = paladin.Id }; User user1 = new User() { Id = Guid.NewGuid(), Name = "User1", Email = "*****@*****.**", Password = "******".HashString(), RegisterDate = DateTime.Now, IsConfirmed = true, RoleId = user.Id, CharacterClassId = rogue.Id }; User user2 = new User() { Id = Guid.NewGuid(), Name = "User2", Email = "*****@*****.**", Password = "******".HashString(), RegisterDate = DateTime.Now, IsConfirmed = true, RoleId = user.Id, CharacterClassId = priest.Id }; User user3 = new User() { Id = Guid.NewGuid(), Name = "User3", Email = "*****@*****.**", Password = "******".HashString(), RegisterDate = DateTime.Now, IsConfirmed = true, RoleId = user.Id, CharacterClassId = shaman.Id }; #endregion #region Добавление настроек SettingsForum settingsForum = new SettingsForum() { Id = Guid.NewGuid(), SubsectionPageSize = 10, TopicPageSize = 10 }; SettingsGallery settingsGallery = new SettingsGallery() { Id = Guid.NewGuid(), GalleriesPerPage = 12, ImagesPerGallery = 30, MaxImageSize = 2, ImageResizeQuality = 50 }; SettingsNews settingsNews = new SettingsNews() { Id = Guid.NewGuid(), MaxImageSize = 2, ImageResizeQuality = 50 }; #endregion modelBuilder.Entity <CharacterClass>().HasData(new CharacterClass[] { paladin, warrior, shaman, hunter, rogue, druid, priest, mage, warlock }); modelBuilder.Entity <Role>().HasData(new Role[] { admin, officer, member, recruit, user }); modelBuilder.Entity <User>().HasData(new User[] { Administrator, Anonymous, user1, user2, user3 }); modelBuilder.Entity <SettingsForum>().HasData(settingsForum); modelBuilder.Entity <SettingsGallery>().HasData(settingsGallery); modelBuilder.Entity <SettingsNews>().HasData(settingsNews); base.OnModelCreating(modelBuilder); }
public async Task <IActionResult> CreateNews(CreateNewsViewModel model, IFormFileCollection uploads) { SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync(); // Объем изображения в мегабайтах int imageSize = 1048576 * settings.MaxImageSize; if (uploads.Count > 3) { ModelState.AddModelError("NewsImage", $"Нельзя загрузить больше 3 изображений"); } else { // Проверяем, чтобы размер файлов не превышал заданный объем foreach (var file in uploads) { if (file.Length > imageSize) { ModelState.AddModelError("NewsImage", $"Файл \"{file.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB."); break; } } } // Если все в порядке, заходим в тело условия if (ModelState.IsValid) { // Создаем экземпляр класса News и присваиваем ему значения News news = new News() { Id = Guid.NewGuid(), NewsTitle = model.NewsTitle, NewsBody = model.NewsBody.SpecSymbolsToView(), NewsDate = DateTime.Now, NewsUserName = User.Identity.Name }; // Далее начинаем обработку изображений List <NewsImage> newsImages = new List <NewsImage>(); foreach (var uploadedImage in uploads) { // Если размер входного файла больше 0, заходим в тело условия if (uploadedImage.Length > 0) { // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки FileInfo imgFile = new FileInfo(uploadedImage.FileName); // Приводим расширение к нижнему регистру (если оно было в верхнем) string imgExtension = imgFile.Extension.ToLower(); // Генерируем новое имя для файла string newFileName = Guid.NewGuid() + imgExtension; // Пути сохранения файла string originalDirectory = "/uploadedfiles/news/images/original/"; string scaledDirectory = "/uploadedfiles/news/images/scaled/"; string pathOriginal = originalDirectory + newFileName; // изображение исходного размера string pathScaled = scaledDirectory + newFileName; // уменьшенное изображение // Если такие директории не созданы, то создаем их if (!Directory.Exists(_appEnvironment.WebRootPath + originalDirectory)) { Directory.CreateDirectory(_appEnvironment.WebRootPath + originalDirectory); } if (!Directory.Exists(_appEnvironment.WebRootPath + scaledDirectory)) { Directory.CreateDirectory(_appEnvironment.WebRootPath + scaledDirectory); } // В операторе try/catch делаем уменьшенную копию изображения. // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке try { // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение using (Image image = Image.Load(uploadedImage.OpenReadStream())) { // Создаем уменьшенную копию и обрезаем её var clone = image.Clone(x => x.Resize(new ResizeOptions { Mode = ResizeMode.Crop, Size = new Size(300, 169) })); // Сохраняем уменьшенную копию await clone.SaveAsync(_appEnvironment.WebRootPath + pathScaled, new JpegEncoder { Quality = settings.ImageResizeQuality }); // Сохраняем исходное изображение await image.SaveAsync(_appEnvironment.WebRootPath + pathOriginal); } } // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке catch { // Создаем сообщение об ошибке для вывода пользователю ModelState.AddModelError("NewsImage", $"Ошибка при загрузке файла {uploadedImage.FileName}. Обратитесь к администратору сайта."); // Удаляем только что созданные файлы (если ошибка возникла не на первом файле) foreach (var image in newsImages) { // Исходные (полноразмерные) изображения FileInfo imageOriginal = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathOriginal); if (imageOriginal.Exists) { imageOriginal.Delete(); } // И их уменьшенные копии FileInfo imageScaled = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathScaled); if (imageScaled.Exists) { imageScaled.Delete(); } } // Возвращаем модель с сообщением об ошибке в представление return(View(model)); } // Создаем объект класса NewsImage со всеми параметрами NewsImage newsImage = new NewsImage() { Id = Guid.NewGuid(), ImageName = newFileName, ImagePathOriginal = pathOriginal, ImagePathScaled = pathScaled, NewsId = news.Id, ImageDate = DateTime.Now }; // Добавляем объект newsImage в список newsImages newsImages.Add(newsImage); } } // Если в процессе выполнения не возникло ошибок, сохраняем всё в БД if (newsImages != null && newsImages.Count > 0) { await _websiteDB.NewsImages.AddRangeAsync(newsImages); } await _websiteDB.News.AddAsync(news); await _websiteDB.SaveChangesAsync(); // Редирект на главную страницу return(RedirectToAction("Index", "News")); } // Возврат модели в представление в случае, если запорится валидация return(View(model)); }
public async Task <IActionResult> EditNews(EditNewsViewModel model, IFormFileCollection uploads) { SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync(); int imageSize = 1048576 * settings.MaxImageSize; // Ищем запись в БД по Id News news = await _websiteDB.News.FirstOrDefaultAsync(n => n.Id == model.NewsId); // Если запись существует, продолжаем обработку if (news != null) { // Проверяем, чтобы общее количество изображений не превышало установленный лимит if (uploads.Count > 3 - model.NewsImagesCount) { ModelState.AddModelError("NewsImage", $"Превышен лимит изображений для одной записи: 3"); } else { // Проверяем, чтобы размер файлов не превышал заданный объем foreach (var file in uploads) { if (file.Length > imageSize) { ModelState.AddModelError("NewsImage", $"Файл \"{file.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB."); break; } } } // Если все в порядке, заходим в тело условия if (ModelState.IsValid) { //News news = await _websiteDB.News.FirstAsync(n => n.Id == model.NewsId); // Обновляем данные news.NewsTitle = model.NewsTitle; news.NewsBody = model.NewsBody.SpecSymbolsToView(); // Далее начинаем обработку загружаемых изображений List <NewsImage> newsImages = new List <NewsImage>(); foreach (var uploadedImage in uploads) { // Если размер входного файла больше 0, заходим в тело условия if (uploadedImage.Length > 0) { // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки FileInfo imgFile = new FileInfo(uploadedImage.FileName); // Приводим расширение к нижнему регистру (если оно было в верхнем) string imgExtension = imgFile.Extension.ToLower(); // Генерируем новое имя для файла string newFileName = Guid.NewGuid() + imgExtension; // Пути сохранения файла string originalDirectory = "/uploadedfiles/news/images/original/"; string scaledDirectory = "/uploadedfiles/news/images/scaled/"; string pathOriginal = originalDirectory + newFileName; // изображение исходного размера string pathScaled = scaledDirectory + newFileName; // уменьшенное изображение // Если такие директории не созданы, то создаем их if (!Directory.Exists(_appEnvironment.WebRootPath + originalDirectory)) { Directory.CreateDirectory(_appEnvironment.WebRootPath + originalDirectory); } if (!Directory.Exists(_appEnvironment.WebRootPath + scaledDirectory)) { Directory.CreateDirectory(_appEnvironment.WebRootPath + scaledDirectory); } // В операторе try/catch делаем уменьшенную копию изображения. // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке try { // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение using (Image image = Image.Load(uploadedImage.OpenReadStream())) { // Создаем уменьшенную копию и обрезаем её var clone = image.Clone(x => x.Resize(new ResizeOptions { Mode = ResizeMode.Crop, Size = new Size(300, 169) })); // Сохраняем уменьшенную копию await clone.SaveAsync(_appEnvironment.WebRootPath + pathScaled, new JpegEncoder { Quality = settings.ImageResizeQuality }); // Сохраняем исходное изображение await image.SaveAsync(_appEnvironment.WebRootPath + pathOriginal); } } // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке catch { // Создаем сообщение об ошибке для вывода пользователю ModelState.AddModelError("NewsImage", $"Ошибка при обработке файла {uploadedImage.FileName}. Обратитесь к администратору сайта."); // Удаляем только что созданные файлы (если ошибка возникла не на первом файле) foreach (var image in newsImages) { // Исходные (полноразмерные) изображения FileInfo imageOriginal = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathOriginal); if (imageOriginal.Exists) { imageOriginal.Delete(); } // И их уменьшенные копии FileInfo imageScaled = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathScaled); if (imageScaled.Exists) { imageScaled.Delete(); } } // Возвращаем модель с сообщением об ошибке в представление return(View(model)); } // Создаем объект класса NewsImage со всеми параметрами NewsImage newsImage = new NewsImage() { Id = Guid.NewGuid(), ImageName = newFileName, ImagePathOriginal = pathOriginal, ImagePathScaled = pathScaled, NewsId = news.Id, ImageDate = DateTime.Now }; // Добавляем объект newsImage в список newsImages newsImages.Add(newsImage); } } // Если в процессе выполнения не возникло ошибок, сохраняем всё в БД if (newsImages != null && newsImages.Count > 0) { await _websiteDB.NewsImages.AddRangeAsync(newsImages); } _websiteDB.News.Update(news); await _websiteDB.SaveChangesAsync(); // Редирект на главную страницу return(RedirectToAction("Index", "News")); } // В случае, если при редактировании пытаться загрузить картинку выше разрешенного лимита, то перестают отображаться уже имеющиеся изображения // При перегонке модели из гет в пост, теряется список с изображениями. Причина пока не ясна, поэтому сделал такой костыль // Счетчик соответственно тоже обнулялся, поэтому его тоже приходится переназначать заново List <NewsImage> images = await _websiteDB.NewsImages.Where(i => i.NewsId == model.NewsId).OrderByDescending(i => i.ImageDate).ToListAsync(); model.NewsImages = images; model.NewsImagesCount = images.Count; // Возврат модели в представление в случае, если запорится валидация return(View(model)); } else { return(Redirect("/Main/PageNotFound")); } }