Я создаю страницу редактирования для некоторых продуктов, у которых есть свойство 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, дайте мне знать. Заранее спасибо!
Я создаю страницу редактирования для некоторых продуктов, у которых есть свойство ImagePath. Когда я создаю продукт, я использую ввод типа IFormFile для загрузки изображения в папку /img/products веб-сайта, и он работает отлично. Вот для контекста: [code][HttpPost] public async Task CreateProduct(AdminCreateProductVM vm) { if (!ModelState.IsValid) return View(vm);
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); }
return RedirectToAction(nameof(ManageProduct)); } [/code] Проблема в том, что когда я хочу изменить продукт, я хочу заполнить входные данные IFormFile изображением, которое в данный момент связано с продуктом по умолчанию, но оставить возможность изменить его с помощью загружаю новый. Я пробовал несколько вещей, чтобы ViewModel содержал IFormFile при загрузке новой страницы, и все это не сработало. Код, который у меня есть в данный момент (см. ниже), создает объект IFormFile со всеми необходимыми свойствами, но при загрузке страницы входные данные не заполняются предварительно. [code]public IActionResult EditProduct(Guid id) { ViewBag.Id = id;
var toEdit = _context.Products.Find(id);
if (toEdit is null) throw new ArgumentOutOfRangeException(nameof(id));
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); } [/code] Если вам нужен какой-либо код из ввода HTML или ViewModel, дайте мне знать. Заранее спасибо!
Я изучаю методы передачи файлов и их влияние на производительность для различных размеров файлов. Идеально, поскольку они избегают ненужных копий данных и улучшают производительность, устраняя передачи памяти пользовательского пространства. Они...
В моем коде есть метод OnPost(), который получает IFormCollection, через который я передаю несколько файлов. Я всегда хочу, чтобы один из этих файлов всегда был индексом списка . Есть ли способ преобразовать этот List обратно в исходную...
В моем коде есть метод OnPost(), который получает IFormCollection, через который я передаю несколько файлов. Я всегда хочу, чтобы один из этих файлов всегда был индексом списка . Есть ли способ преобразовать этот List обратно в исходную...
Я работаю над проектом, в котором мне нужно обновить запись, в которой пользователь также может загрузить изображение с помощью IFormFile, все работает нормально, за исключением свойства IFormFile, которое всегда дает мне ноль при отправке формы. Я...
Привет, я работаю над созданием прошивки на базе Android 13 для Pixel 4a 5g. По сути, моя проблема заключается в том, что я хочу предварительно предоставить разрешение на доступ и разрешение на захват экрана для APK-файла Assist, который включен в...