Как сохранить изображения в разные папки в базе данных с помощью ASP.NET Core? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть проект ASP.NET MVC, который отлично работает для сохранения изображений в разные папки и подпапки. Но когда я хочу сделать то же самое в ASP.NET Core 2.2, он не работает как есть, и мне нужна помощь для решения этой проблемы, и я был бы очень признателен за вашу помощь.

Вот мой ASP.NETВерсия MVC, которая не работает в ASP.NET Core 2.2:

public ActionResult AddCar(CarVM model, HttpPostedFileBase file)
{
    using (ApplicationDbContext db = new ApplicationDbContext())
    {
        Car  c = new Car();
        c.Name = model.Name;
        c.Mileage = model.MileAge;

        db.Car.Add(c);
        db.SaveChanges();

        // Get Inserted Id;
        int id = c.CarId; 
    }

    // to insert Image of the car in different folders in ASP.NET MVC I do like this, but this not working in ASP.NET Core 2.2
    // Create necessary directories
    var originalDirectory = new DirectoryInfo(string.Format("{0}Images\\Uploads", Server.MapPath(@"\")));

    // I add folder "CarsImage" because I have other Products image too
    var pathString1 = Path.Combine(originalDirectory.ToString(), "CarsImage");
    var pathString2 = Path.Combine(originalDirectory.ToString(), "CarsImage\\" + id.ToString());
    var pathString3 = Path.Combine(originalDirectory.ToString(), "CarsImage\\" + id.ToString() + "\\Thumbs");
    var pathString4 = Path.Combine(originalDirectory.ToString(), "CarsImage\\" + id.ToString() + "\\Gallery");
    var pathString5 = Path.Combine(originalDirectory.ToString(), "CarsImage\\" + id.ToString() + "\\Gallery\\Thumbs");

    // Check if directory exist, if not then create them
    if (!Directory.Exists(pathString1))
        Directory.CreateDirectory(pathString1);

    if (!Directory.Exists(pathString2))
        Directory.CreateDirectory(pathString2);

    if (!Directory.Exists(pathString3))
        Directory.CreateDirectory(pathString3);

    if (!Directory.Exists(pathString4))
        Directory.CreateDirectory(pathString4);

    if (!Directory.Exists(pathString5))
        Directory.CreateDirectory(pathString5);

    // Check if file was uploaded
    if (file != null && file.ContentLength > 0)
    {
        // Get file extension
        string ext = file.ContentType.ToLower();

        // Verify extension
        if (ext != "image/jpg" &&
            ext != "image/jpeg" &&
            ext != "image/pjpeg" &&
            ext != "image/gif" &&
            ext != "image/x-png" &&
            ext != "image/png")
        {
            using (ApplicationDbContext db = new ApplicationDbContext())
            {
                model.Categories = new SelectList(db.Category.ToList(), "CategoryId", "CategoryName");
                model.Mileages = new SelectList(db.MileAge.ToList(), "MileAgeId", "Mile");

                ModelState.AddModelError("", "The image was not uploaded - Wrong image extension");
                return View(model);
            }
        }

        // Init image name
        string imageName = file.FileName;

        // Save image name to Car table
        using (ApplicationDbContext db = new ApplicationDbContext())
        {
            Car dto = db.Car.Find(id);
            dto.ImageName = imageName;
            db.SaveChanges();
        }

        // Set Original and image paths
        var path = string.Format("{0}\\{1}", pathString2, imageName);
        var path2 = string.Format("{0}\\{1}", pathString3, imageName);

        // Save Original
        file.SaveAs(path); // Not working in core

        // Create and save thumb
        WebImage img = new WebImage(file.InputStream);  // WebImage not working in core
        img.Resize(200, 200);
        img.Save(path2);
    }
}

Итак, я пробовал с IFormFile .... и

string uploadFolder = Path.Combine(hostingEnvirnment.WebRootPath, "images\\upload");  

Но я не знаю, какделать. Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

В ASP.NET Core вы можете использовать Directory.GetCurrentDirectory(), чтобы получить текущий рабочий каталог приложения и объединить путь к папке в корневом каталоге статического файла.

var originalDirectory = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\\Images\\Uploads");

Затем использовать Path.Combine()чтобы задать исходный путь и путь к изображению, вы можете сохранить файлы типа IFormFile, как показано ниже:

// Set Original and image paths
   var filePath = Path.Combine(pathString2, imageName);
   var filePath2 = Path.Combine(pathString3, imageName);

// Save Original
   file.CopyTo(new FileStream(filePath, FileMode.Create));

Для сохранения миниатюрного изображения вы можете установить System.Drawing.Common пакет и использовать следующий код:

Stream stream = file.OpenReadStream();
Image newImage = GetReducedImage(200, 200, stream);

newImage.Save(filePath2);

public Image GetReducedImage(int width, int height, Stream resourceImage)
    {
        try
        {
            Image image = Image.FromStream(resourceImage);
            Image thumb = image.GetThumbnailImage(width, height, () => false, IntPtr.Zero);

            return thumb;
        }
        catch (Exception e)
        {
            return null;
        }
    }

Полный код выглядит следующим образом:

public readonly ApplicationDbContext _context;

public HomeController( ApplicationDbContext context)
{
     _context = context;
}
[HttpPost]
    public ActionResult AddCar(Car model, IFormFile file)
    {
        Car c = new Car();
        c.Name = model.Name;
        c.Mileage = model.MileAge;
        _context.Car.Add(c);
        _context.SaveChanges();

        // Get Inserted Id;
        int id = c.CarId;

        // Create necessary directories 
        var originalDirectory = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\\Images\\Uploads");

        // different image folder
        var pathString1 = Path.Combine(originalDirectory.ToString(), "CarsImage");
        var pathString2 = Path.Combine(originalDirectory.ToString(), "CarsImage\\" + id.ToString());
        var pathString3 = Path.Combine(originalDirectory.ToString(), "CarsImage\\" + id.ToString() + "\\Thumbs");
        var pathString4 = Path.Combine(originalDirectory.ToString(), "CarsImage\\" + id.ToString() + "\\Gallery");

        // Check if directory exist, if not then create them
        if (!Directory.Exists(pathString1))
            Directory.CreateDirectory(pathString1);

        if (!Directory.Exists(pathString2))
            Directory.CreateDirectory(pathString2);

        if (!Directory.Exists(pathString3))
            Directory.CreateDirectory(pathString3);

        if (!Directory.Exists(pathString4))
            Directory.CreateDirectory(pathString4);

        // Check if file was uploaded
        if (file != null && file.Length > 0)
        {
            // Get file extension
            string ext = file.ContentType.ToLower();

            // Verify extension
            if (ext != "image/jpg" &&
                ext != "image/jpeg" &&
                ext != "image/pjpeg" &&
                ext != "image/gif" &&
                ext != "image/x-png" &&
                ext != "image/png")
            {
                using (ApplicationDbContext db = new ApplicationDbContext())
                {
                    model.Categories = new SelectList(db.Category.ToList(), "CategoryId", "CategoryName");
                    model.Mileages = new SelectList(db.MileAge.ToList(), "MileAgeId", "Mile");

                    ModelState.AddModelError("", "The image was not uploaded - Wrong image extension");
                    return View();
                }
            }

            // Init image name
            string imageName = file.FileName;

            // Save image name to Car table
             Car dto = _context.Car.Find(id);
             dto.ImageName = imageName; 
             _context.SaveChanges();

            // Set Original and image paths
            var filePath = Path.Combine(pathString2, imageName);
            var filePath2 = Path.Combine(pathString3, imageName);

            // Save Original
            file.CopyTo(new FileStream(filePath, FileMode.Create));

            // Create and save thumb
            Stream stream = file.OpenReadStream();
            Image newImage = GetReducedImage(200, 200, stream);
            newImage.Save(filePath2);
        }
        return View();
    }

    public Image GetReducedImage(int width, int height, Stream resourceImage)
    {
        try
        {
            Image image = Image.FromStream(resourceImage);
            Image thumb = image.GetThumbnailImage(width, height, () => false, IntPtr.Zero);
            return thumb;
        }
        catch (Exception e)
        {
            return null;
        }
    }
0 голосов
/ 13 октября 2019

Вам нужно использовать IHostingEnvironment, чтобы получить путь к приложению в ASP.NET Core. Проверьте это SO ответ для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...