Я хочу предварительно заполнить ввод типа IFormFileC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Я хочу предварительно заполнить ввод типа IFormFile

Сообщение Anonymous »

Я создаю страницу редактирования для некоторых продуктов, у которых есть свойство ImagePath. Когда я создаю продукт, я использую ввод типа IFormFile для загрузки изображения в папку /img/products веб-сайта, и он работает отлично. Вот для контекста:

Код: Выделить всё

[HttpPost]
public async Task CreateProduct(AdminCreateProductVM vm)
{
if (!ModelState.IsValid)
return View(vm);

bool productAlreadyExists = _context.Products.Any(u => u.SKU == vm.SKU);

if (productAlreadyExists)
{
ModelState.AddModelError(string.Empty, "Un produit avec le même SKU existe déjà.");
return View(vm);
}

if (vm.Image is not null && vm.Image.Length > 0)
{
var webRootPath = _hostingEnvironment.WebRootPath;
var filePath = Path.Combine(webRootPath, "img/products", vm.SKU! + ".jpg");

using (var stream = new FileStream(filePath, FileMode.Create))
{
await vm.Image.CopyToAsync(stream);
}
}
else
{
ModelState.AddModelError(string.Empty, "Veuillez sélectionner une image.");
return View(vm);
}

var product = new Product()
{
SKU = vm.SKU,
Name = vm.Name,
Brand = vm.Brand,
Model = vm.Model,
ImagePath = "~/img/products/" + vm.SKU + ".jpg",
WeightInGrams = vm.WeightInGrams,
Size = vm.Size,
Quantity = vm.Quantity,
RetailPrice = vm.RetailPrice,
DiscountedPrice = vm.DiscountedPrice,
ShortDescription = vm.ShortDescription,
FullDescription = vm.FullDescription,
PublicationDate = (DateTime?)DateTime.Now,
LastUpdated = (DateTime?)DateTime.Now,
IsArchived = false
};

_context.Products.Add(product);
_context.SaveChanges();

return RedirectToAction(nameof(ManageProduct));
}
Проблема в том, что когда я хочу изменить продукт, я хочу заполнить входные данные IFormFile изображением, которое в данный момент связано с продуктом по умолчанию, но оставить возможность изменить его с помощью загружаю новый. Я пробовал несколько вещей, чтобы ViewModel содержал IFormFile при загрузке новой страницы, и все это не сработало. Код, который у меня есть в данный момент (см. ниже), создает объект IFormFile со всеми необходимыми свойствами, но при загрузке страницы входные данные не заполняются предварительно.

Код: Выделить всё

public IActionResult EditProduct(Guid id)
{
ViewBag.Id = id;

var toEdit = _context.Products.Find(id);

if (toEdit is null)
throw new ArgumentOutOfRangeException(nameof(id));

IFormFile? toEditImage = null;
string toEditFullImagePath = _hostingEnvironment.WebRootPath + toEdit.ImagePath![1..];

if (System.IO.File.Exists(toEditFullImagePath))
{
using (FileStream fileStream = new FileStream(toEditFullImagePath, FileMode.Open, FileAccess.Read))
{
var fileName = Path.GetFileName(toEditFullImagePath);

var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(fileName, out var contentType))
{
contentType = "application/octet-stream"; // Utilisez un type MIME par défaut si l'extension n'est pas reconnue.
}

var headers = new HeaderDictionary
{
["Content-Disposition"] = new StringValues("form-data; name=\"Image\"; filename=\"" + fileName + "\""),
["Content-Type"] = new StringValues(contentType)
};

toEditImage = new FormFile(fileStream, 0, fileStream.Length, fileName, fileName)
{
Headers = headers
};
}
}
else
{
ModelState.AddModelError(string.Empty, "L'image du produit n'a pas été trouvée.");
}

var vm = new AdminEditProductVM
{
SKU = toEdit.SKU,
Name = toEdit.Name,
Brand = toEdit.Brand,
Model = toEdit.Model,
Image = toEditImage,
WeightInGrams = toEdit.WeightInGrams,
Size = toEdit.Size,
Quantity = toEdit.Quantity,
RetailPrice = toEdit.RetailPrice,
DiscountedPrice = toEdit.DiscountedPrice,
ShortDescription = toEdit.ShortDescription,
FullDescription = toEdit.FullDescription
};

return View(vm);
}
Если вам нужен какой-либо код из ввода HTML или ViewModel, дайте мне знать. Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/774 ... -iformfile
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»