Почему мои файлы не сохраняются в указанном мной каталоге в моем базовом приложении ASP. NET? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь сохранить файлы в локальном каталоге в моем ASp. NET Базовом приложении, хотя есть и другие, более эффективные способы сделать это, это способ, который запрашивает пользователь. Итак, я настроил загрузку моего файла в моем контроллере следующим образом:

HomeController.cs

[HttpPost]
public IActionResult Create(CreateProductViewModel model)
{
    if (ModelState.IsValid && model !=null)
    {
        try
        {
            //Save the Product
            var product = new Products
            {
                Id = model.Products.Id,
                Title = model.Products.Title,
            };
            //Insert the product and get the newly created Id
            _productsService.InsertProduct(product);
            int newId = product.Id;

            //Process the Images
            if (model.Products.ProductImages != null)
            {
                try
                {                            
                    var root = _env.WebRootPath;
                    var images = model.Products.ProductImages;
                    var path = Path.Combine(root, "images", "products", newId.ToString());                            

                    foreach (var item in images) 
                    {
                        using (var stream = System.IO.File.Create(path))
                        {                                    
                            Stream inStream = item.OpenReadStream();
                            using Image image = Image.Load(inStream);
                            int width = 350;
                            int height = 0;
                            var clone = image.Clone(i => i.Resize(width, height));
                            clone.SaveAsJpeg(stream);                                
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        };
    }
    return RedirectToAction("Index", "Products");
}

Вот модель, которая представляет эти данные

using Microsoft.AspNetCore.Http;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;

namespace MyProject.Data
{
    public class Products : BaseEntity
    {           
        public string Title { get; set; }  

        [NotMapped]
        public IFormFileCollection ProductImages { get; set; }
    }
}

Происходит несколько вещей, процесс должен быть следующим:

  • Продукт создан
  • Захвачен новый идентификатор продукта
  • Путь к изображению создается с использованием нового идентификатора продукта
  • Все изображения перебираются, обрабатываются и сохраняются в этом новом каталоге.

, т.е.

  • wwwroot/images/products/54/imagefile01.jpg
  • wwwroot/images/products/54/imagefile02.jpg
  • wwwroot/images/products/54/imagefile03.jpg

Однако это не совсем так. Изображения не сохраняются, приложение создает пустой файл (0 байт) с идентификатором продукта в качестве имени:

  • wwwroot/images/products/54

Что я делать неправильно, что он не создал идентификатор продукта правильно, и почему он не сохраняет мои файлы в этот каталог? Я чувствую, что пропустил шаг.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Вы не можете непосредственно прочитать папку, которая не была создана, и вам не нужно каждый раз создавать один и тот же путь к файлу.

Перед созданием, пожалуйста, добавьте оценку, существует ли путь к файлу.

И вам не нужно конвертировать jpg в созданном пути в формат Stream для сохранения загруженного изображения. Вы можете напрямую использовать метод clone.Save(filePath) для сохранения этих изображений в формате jpeg.

Пожалуйста, попробуйте следующий код.

[HttpPost]
        public IActionResult Create(ProductModel model)
        {
            if (ModelState.IsValid && model != null)
            {
                try
                {
                    //Save the Product
                    var product = new NewProducts
                    {
                        Id = model.Products.Id,
                        Title = model.Products.Title,
                    };
                    //Insert the product and get the newly created Id
                     _productsService.InsertProduct(product);
                    int newId = product.Id;

                    //Process the Images
                    if (model.Products.ProductImages != null)
                    {
                        try
                        {
                            var root = _env.WebRootPath;
                            var images = model.Products.ProductImages;
                            var path = Path.Combine(root, "images", "products", newId.ToString());
                            var iterator = 0;
                            foreach (var item in images)
                            {
                                var filePath = Path.Combine(path, $"imagefile0{iterator++}.jpg");
                                if (!Directory.Exists(path))
                                {
                                    Directory.CreateDirectory(path);
                                } 
                                Stream inStream = item.OpenReadStream();
                                using Image image = Image.Load(inStream);
                                int width = 350;
                                int height = 0;
                                var clone = image.Clone(i => i.Resize(width, height));
                                clone.Save(filePath); 
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                };
            }
            return RedirectToAction("Index", "Products");
        }

Вот процесс и результат отладки:

enter image description here

0 голосов
/ 24 апреля 2020

path неверно. Вы сохраняете все iamges в один каталог с тем же именем. Из-за линии using (var stream = System.IO.File.Create(path))

И высота изображения равна 0. Вы также должны изменить это.

Попробуйте это.

[HttpPost]
public IActionResult Create(CreateProductViewModel model)
{
    if (ModelState.IsValid && model !=null)
    {
        try
        {
            //Save the Product
            var product = new Products
            {
                Id = model.Products.Id,
                Title = model.Products.Title,
            };
            //Insert the product and get the newly created Id
            _productsService.InsertProduct(product);
            int newId = product.Id;

            //Process the Images
            if (model.Products.ProductImages != null)
            {
                try
                {                            
                    var root = _env.WebRootPath;
                    var images = model.Products.ProductImages;
                    var saveDirectory = Path.Combine(root, "images", "products", newId.ToString());                            

                    var iterator = 0;
                    foreach (var item in images) 
                    {
                        using (var stream = System.IO.File.Create(Path.Combine(saveDirectory, $"image{iterator++}.jpg")))
                        {                                    
                            Stream inStream = item.OpenReadStream();
                            using Image image = Image.Load(inStream);
                            int width = 350;
                            int height = WHY TIS IS ZERO?;
                            var clone = image.Clone(i => i.Resize(width, height));
                            clone.SaveAsJpeg(stream);                                
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        };
    }
    return RedirectToAction("Index", "Products");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...