public async Task <IActionResult> ApplySettings(IndexViewModel model) { if (ModelState.IsValid) { SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync(); settings.GalleriesPerPage = model.GalleriesPerPage; settings.ImageResizeQuality = model.ImageResizeQuality; settings.MaxImageSize = model.MaxImageSize; settings.ImagesPerGallery = model.ImagesPerGallery; _websiteDB.SettingsGallery.Update(settings); await _websiteDB.SaveChangesAsync(); } return(RedirectToAction("Index", "Gallery")); }
public async Task <IActionResult> Index() { List <Gallery> galleries = await _websiteDB.Galleries.ToListAsync(); SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync(); IndexViewModel model = new IndexViewModel() { GalleriesPerPage = settings.GalleriesPerPage, ImagesPerGallery = settings.ImagesPerGallery, MaxImageSize = settings.MaxImageSize, ImageResizeQuality = settings.ImageResizeQuality, Galleries = galleries }; return(View(model)); }
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> CreateGallery(CreateGalleryViewModel model, IFormFile sliderImage) { // Настройки галереи SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync(); int imageSize = 1048576 * settings.MaxImageSize; // Проверяем, чтобы обязательно был указан файл с изображением if (sliderImage == null || sliderImage.Length == 0) { ModelState.AddModelError("GallerySliderImage", "Укажите изображение для показа в слайдере."); } // Проверяем, чтобы входящий файл не превышал установленный максимальный размер if (sliderImage != null && sliderImage.Length > imageSize) { ModelState.AddModelError("GallerySliderImage", $"Файл \"{sliderImage.FileName}\" превышает установленный лимит 2MB."); } // Проверяем чтобы не случился дубликат имени галереи Gallery gallery = await _websiteDB.Galleries.FirstOrDefaultAsync(g => g.GalleryTitle == model.GalleryTitle); if (gallery != null) { ModelState.AddModelError("GalleryTitle", "Галерея с таким именем уже существует"); } // Если на пути проблем не возникло, то создаем галерею if (ModelState.IsValid) { // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки FileInfo imgFile = new FileInfo(sliderImage.FileName); // Приводим расширение файла к нижнему регистру string imgExtension = imgFile.Extension.ToLower(); // Генерируем новое имя для файла string newFileName = Guid.NewGuid() + imgExtension; // Пути сохранения файла string sliderDirectory = "/uploadedfiles/gallery/images/slider/"; // Если такой директории не существует, то создаем её if (!Directory.Exists(_appEnvironment.WebRootPath + sliderDirectory)) { Directory.CreateDirectory(_appEnvironment.WebRootPath + sliderDirectory); } // Путь для слайд-изображения string pathSliderImage = sliderDirectory + newFileName; // В операторе try/catch делаем уменьшенную копию изображения. // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке try { // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение using (Image image = Image.Load(sliderImage.OpenReadStream())) { // Создаем уменьшенную копию и обрезаем её var clone = image.Clone(x => x.Resize(new ResizeOptions { Mode = ResizeMode.Crop, Size = new Size(1056, 220) })); // Сохраняем уменьшенную копию await clone.SaveAsync(_appEnvironment.WebRootPath + pathSliderImage, new JpegEncoder { Quality = settings.ImageResizeQuality }); } } // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке catch { // Создаем сообщение об ошибке для вывода пользователю ModelState.AddModelError("GallerySliderImage", $"Файл {sliderImage.FileName} имеет неверный формат."); // Возвращаем модель с сообщением об ошибке в представление return(View(model)); } if (string.IsNullOrEmpty(model.GalleryDescription)) { model.GalleryDescription = ""; } gallery = new Gallery() { Id = Guid.NewGuid(), GalleryTitle = model.GalleryTitle, GalleryDescription = model.GalleryDescription.SpecSymbolsToView(), GalleryDate = DateTime.Now, GalleryUserName = User.Identity.Name, GallerySliderImage = pathSliderImage }; await _websiteDB.Galleries.AddAsync(gallery); await _websiteDB.SaveChangesAsync(); return(RedirectToAction("Index", "Gallery")); } // Возврат модели при неудачной валидации return(View(model)); }
public async Task <IActionResult> EditGallery(EditGalleryViewModel model, IFormFile sliderImage) { // Настройки галереи SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync(); int imageSize = 1048576 * settings.MaxImageSize; // Если размер превью-изображения превышает установленный лимит, генерируем ошибку модели if (sliderImage != null && sliderImage.Length > imageSize) { ModelState.AddModelError("GalleryPreviewImage", $"Файл \"{sliderImage.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB."); } // Проверяем, чтобы такая галерея существовала в БД Gallery gallery = await _websiteDB.Galleries.FirstOrDefaultAsync(g => g.Id == model.GalleryId); if (gallery == null) { return(Redirect("/Main/PageNotFound")); } // Если ошибок не возникло, заходим в тело условия if (ModelState.IsValid) { if (string.IsNullOrEmpty(model.GalleryDescription)) { model.GalleryDescription = ""; } // Если исходный файл не равен NULL и его размер больше 0, заходим в тело условия if (sliderImage != null && sliderImage.Length > 0) { // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки FileInfo imgFile = new FileInfo(sliderImage.FileName); // Приводим расширение к нижнему регистру (если оно было в верхнем) string imgExtension = imgFile.Extension.ToLower(); // Генерируем новое имя для файла string newFileName = Guid.NewGuid() + imgExtension; // Пути сохранения файла string sliderDirectory = "/uploadedfiles/gallery/images/slider/"; // Пути сохранения файла string pathSliderImage = sliderDirectory + newFileName; // уменьшенное изображение // Если такой директории не существует, то создаем её if (!Directory.Exists(_appEnvironment.WebRootPath + sliderDirectory)) { Directory.CreateDirectory(_appEnvironment.WebRootPath + sliderDirectory); } // В операторе try/catch делаем уменьшенную копию изображения. // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке try { // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение using (Image image = Image.Load(sliderImage.OpenReadStream())) { // Создаем уменьшенную копию и обрезаем её var clone = image.Clone(x => x.Resize(new ResizeOptions { Mode = ResizeMode.Crop, Size = new Size(1056, 220) })); // Сохраняем уменьшенную копию await clone.SaveAsync(_appEnvironment.WebRootPath + pathSliderImage, new JpegEncoder { Quality = settings.ImageResizeQuality }); } } // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке catch { // Создаем сообщение об ошибке для вывода пользователю ModelState.AddModelError("GalleryPreviewImage", $"Файл {sliderImage.FileName} имеет неверный формат."); // Возвращаем модель с сообщением об ошибке в представление return(View(model)); } // Удаляем предыдущее изображения для слайдера if (gallery.GallerySliderImage != null) { FileInfo imageToDelete = new FileInfo(_appEnvironment.WebRootPath + gallery.GallerySliderImage); if (imageToDelete.Exists) { imageToDelete.Delete(); } } // Обновляем значения на полученные с формы gallery.GalleryTitle = model.GalleryTitle; gallery.GalleryDescription = model.GalleryDescription.SpecSymbolsToView(); gallery.GallerySliderImage = pathSliderImage; // Сохраняем изменения в БД _websiteDB.Galleries.Update(gallery); await _websiteDB.SaveChangesAsync(); return(RedirectToAction("Index", "Gallery")); } // Если не была выбрана картинка для превью, заходим в блок ELSE else { // Обновляем значения на полученные с формы gallery.GalleryTitle = model.GalleryTitle; gallery.GalleryDescription = model.GalleryDescription.SpecSymbolsToView(); // Сохраняем изменения в БД _websiteDB.Galleries.Update(gallery); await _websiteDB.SaveChangesAsync(); return(RedirectToAction("Index", "Gallery")); } } // Возврат модели при неудачной валидации return(View(model)); }
public async Task <IActionResult> ViewGallery(ViewGalleryViewModel model, IFormFileCollection uploads) { // Настройки галереи SettingsGallery settings = await _websiteDB.SettingsGallery.FirstAsync(); int imageSize = 1048576 * settings.MaxImageSize; int imagesPerGallery = settings.ImagesPerGallery; // Выбираем все изображения, находящиеся в данной галерее List <GalleryImage> images = await _websiteDB.GalleryImages.Where(i => i.GalleryId == model.GalleryId).OrderByDescending(i => i.ImageDate).ToListAsync(); // Проверяем, не превышает ли количество загружаемых изображений допустимый лимит if (uploads.Count > imagesPerGallery - images.Count) { ModelState.AddModelError("GalleryImage", $"Превышен лимит изображений для галереи."); //ModelState.AddModelError("GalleryImage", $"Вы пытаетесь загрузить {uploads.Count} изображений. Лимит галереи {imagesPerGallery} изображений. Вы можете загрузить еще {imagesPerGallery - images.Count} изображений."); } // Если всё в порядке, заходим в ELSE else { // Проверяем, чтобы размер файлов не превышал заданный объем foreach (var file in uploads) { if (file == null || file.Length == 0) { ModelState.AddModelError("GalleryImage", $"Произошла ошибка при обработке файла \"{file.FileName}\"."); break; } if (file.Length > imageSize) { ModelState.AddModelError("GalleryImage", $"Файл \"{file.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB."); break; } } } // Если все в порядке, заходим в тело условия if (ModelState.IsValid) { // Далее начинаем обработку загружаемых изображений List <GalleryImage> galleryImages = new List <GalleryImage>(); foreach (var uploadedImage in uploads) { // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки FileInfo imgFile = new FileInfo(uploadedImage.FileName); // Приводим расширение к нижнему регистру (если оно было в верхнем) string imgExtension = imgFile.Extension.ToLower(); // Генерируем новое имя для файла string newFileName = Guid.NewGuid() + imgExtension; // Пути сохранения файла string originalDirectory = "/uploadedfiles/gallery/images/original/"; string scaledDirectory = "/uploadedfiles/gallery/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("GalleryImage", $"Файл {uploadedImage.FileName} имеет неверный формат."); // Удаляем только что созданные файлы (если ошибка возникла не на первом файле и некоторые уже были загружены на сервер) foreach (var image in galleryImages) { // Исходные (полноразмерные) изображения 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)); } // Создаем объект класса GalleryImage со всеми параметрами GalleryImage galleryImage = new GalleryImage() { Id = Guid.NewGuid(), ImageName = newFileName, ImagePathOriginal = pathOriginal, ImagePathScaled = pathScaled, GalleryId = model.GalleryId, ImageDate = DateTime.Now }; // Добавляем объект galleryImage в список galleryImages galleryImages.Add(galleryImage); } // Если в процессе выполнения не возникло ошибок, сохраняем всё в БД if (galleryImages != null && galleryImages.Count > 0) { await _websiteDB.GalleryImages.AddRangeAsync(galleryImages); await _websiteDB.SaveChangesAsync(); } // Выводим обновленную модель в представление return(RedirectToAction("ViewGallery", "Gallery", new { galleryId = model.GalleryId })); } // В случае, если произошла ошибка валидации, требуется заново присвоить список изображений и счетчик для возвращаемой модели // При перегонке модели из гет в пост, теряется список с изображениями. Причина пока не ясна, поэтому сделал такой костыль // Счетчик соответственно тоже обнулялся, поэтому его тоже приходится переназначать заново model.GalleryImages = images; model.ImagesCount = images.Count; // Возврат модели в представление в случае, если запорится валидация return(View(model)); }