ASP.NET Core MVC - edytowanie zdjęcia

0

Cześć :) chciałbym się was zapytać o co chodzi ponieważ mam jakiś dziwny błąd z edytowaniem zdjęcia.

Gdy wgrywam jakiekolwiek zdjęcie z jakimkolwiek rozszerzeniem przy tworzeniu elementu MenuItem wszytko gra. Mogę je później edytować i zmieniać do woli.
Problem pojawia się gdy zdjęcie nie zostanie wgrane przy tworzeniu i użyje domyślnego które znajduje się już w katalogu.
Po próbach testów zauważyłem że gdy zdjęcie domyślne jest w formacie .jpg i później chcemy je zmienić na zdjęcie .png wyświetla dobrze, jednak gdy chcemy zamienić zdjęcie domyślne na zdjęcie .jpg, wyświetla dalej zdjęcie domyślne, mimo że w samym katalogu zostało zamienione, jednak już na samej stronie widnieje inne zdjęcie.

I odwrotna sytuacja, gdy domyślne jest .png to wyświetla ładnie .jpg ale nie wyświetla znowu .png mimo że w katalogu też się podmienia.

Program robię z kursem na Udemy, modyfikuję go i dodaję nowe elementy do swojego tematu strony, jednakże wgrywanie zdjęć jest kropka w kropke, co prawda nie jest w kursie dokładnie pokazane czy tam działa ponieważ tam tylko pokazane jest jak podmienia zdjęcie domyśle .png na zdjęcie .jpg.

Byłbym niezmiernie wdzięczny gdyby ktoś mógł mi coś poradzić z tym problemem, z góry dziękuję ślicznie :)

A oto trochę kodu:

//Post - Create
        [HttpPost,ActionName("Create")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> CreatePost()
        {
            if(!ModelState.IsValid)
            {
                return View(MenuItemVM);
            }

            _context.MenuItem.Add(MenuItemVM.MenuItem);
            await _context.SaveChangesAsync();

            string webRootPath = _hosting.WebRootPath;
            var files = HttpContext.Request.Form.Files;


            var menuItemFromDB = await _context.MenuItem.FindAsync(MenuItemVM.MenuItem.Id);

            if(files.Count>0)
            {
                var uploads = Path.Combine(webRootPath, "img");
                var extension = Path.GetExtension(files[0].FileName);

                using (var flieStream = new FileStream(Path.Combine(uploads, MenuItemVM.MenuItem.Id + extension), FileMode.Create))
                {
                    files[0].CopyTo(flieStream);
                }

                 menuItemFromDB.Image = @"\img\" + MenuItemVM.MenuItem.Id + extension;
            }
            else
            {
                var uploads = Path.Combine(webRootPath, @"img\" + "default_book.jpg");
                System.IO.File.Copy(uploads, webRootPath + @"\img\" + MenuItemVM.MenuItem.Id + ".jpg");
                menuItemFromDB.Image = @"\img\" + MenuItemVM.MenuItem.Id + ".jpg";
            }

            await _context.SaveChangesAsync();

            return RedirectToAction(nameof(Index));
        }

//Post - Edit
        [HttpPost, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditPost(int? id)
        {

            if(id == null)
            {
                return NotFound();
            }    

            if (!ModelState.IsValid)
            {
                return View(MenuItemVM);
            }

            string webRootPath = _hosting.WebRootPath;
            var files = HttpContext.Request.Form.Files;


            var menuItemFromDB = await _context.MenuItem.FindAsync(MenuItemVM.MenuItem.Id);

            if (files.Count > 0)
            {
                var uploads = Path.Combine(webRootPath, "img");
                var extension_new = Path.GetExtension(files[0].FileName);

                var imgToDel = Path.Combine(webRootPath, menuItemFromDB.Image.TrimStart('\\'));

                if(System.IO.File.Exists(imgToDel))
                {
                    System.IO.File.Delete(imgToDel);
                }

                using (var flieStream = new FileStream(Path.Combine(uploads, MenuItemVM.MenuItem.Id + extension_new), FileMode.Create))
                {
                    files[0].CopyTo(flieStream);
                }

                menuItemFromDB.Image = @"\img\" + MenuItemVM.MenuItem.Id + extension_new;
            }

            menuItemFromDB.Name = MenuItemVM.MenuItem.Name;
            menuItemFromDB.Description = MenuItemVM.MenuItem.Description;
            menuItemFromDB.Price = MenuItemVM.MenuItem.Price;
            menuItemFromDB.CategoryId = MenuItemVM.MenuItem.CategoryId;

            await _context.SaveChangesAsync();

            return RedirectToAction(nameof(Index));
        }
0

A w bazie danych również jest zmieniona ścieżka?

0

W bazie ścieżka to przykładowo "\img\38.png" więc przy zmianie rozszerzenia zmianę ścieżki można zauważyć, jednak przy takim samym rozszerzeniu ścieżka pozostaje taka sama, mimo że zostaje ona nadpisana po zmianie zdjęcia w katalogu

0

Pierwszym powodem może być to, że usuwasz plik i od razu tworzysz taki sam. Dodaj warunek, że jeżeli nazwa i rozszerzenie jest takie samo to nie usuwa.

if(System.IO.File.Exists(imgToDel) && oldName != newName)
                {
                    System.IO.File.Delete(imgToDel);
                }

Można to zrobić dlatego, że flaga FileMode.Create sama sprawdza, czy podany plik istnieje i go zastępuje. Pozostaje nam więc tylko usuwanie w przypadku zmiany nazwy aby nie pozostawiać śmieci.

Jeżeli to nie zadziała to na szybko napisałem i sprawdziłem, u mnie działa bez problemu

ManagementController

[HttpPost]
        [ValidateAntiForgeryToken]
        [Route("Rooms/AvatarChanging")]
        [Authorize(Roles = "Admin")]
        public async Task<IActionResult> RoomChangeAvatar(Guid RoomID, IFormFile file)
        { 
            Room room = _roomService.FindById(RoomID);
            string FileName = _roomService.UploadRoomImage(file, RoomID);
            room.Avatar = FileName;
            await _roomService.UpdateRoom(room);
            TempData["StatusMessage"] = "Avatar zmieniony";
            return RedirectToAction("DisplayRooms");
        }

RoomService

public string UploadRoomImage(IFormFile file, Guid roomID)
        {
            string uniqueFileName = string.Empty;

            string uploadsFolder = Path.Combine(_webHostEnvironment.WebRootPath, "Rooms/Images");
            uniqueFileName = roomID.ToString() + "_" + file.FileName;
            string filePath = Path.Combine(uploadsFolder, uniqueFileName);
            using (var fileStream = new FileStream(filePath, FileMode.Create))
            {
                file.CopyTo(fileStream);
            }
            return uniqueFileName;
        }

Pominąłem wpisywanie kodu odpowiadającego m.in. za walidację aby wszystko było przejrzyste.

1 użytkowników online, w tym zalogowanych: 0, gości: 1