Мне удалось успешно загрузить одно изображение, и процессы проверки и загрузки прошли нормально, но, поскольку я пытался загрузить несколько изображений, ни проверка, ни загрузка не были выполнены.
это модель , называемая «ProductImage», которая представляет объект «изображение», который предполагается сохранить на диске и в базе данных.
public class ProductImage
{
public int ID { get; set; }
[Display(Name = "File")]
[StringLength(100)]
[Index(IsUnique = true)]
public string FileName { get; set; }
}
}
и его контроллер ProductImage, который принимает входящие файлы как «HttpPostedFileBase [] файлы», проходит через них, проверяет длину 1-ноль и длину 2-го файла, и, если они истинны, проверяет файлы с ValidateFile (), чтобы увидеть, являются ли они jpeg, png и ... и меньше, чем 2 МБ, если файлы действительны, затем сохраните файлы на диске и продолжайте сохранять файлы в базе данных, в противном случае выдает сообщения об ошибках.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Upload(HttpPostedFileBase[] files)
{
bool allValid = true;
string inValidFiles = "";
//check the user has entered a file
if (files[0] != null)
{
//if the user has entered less than ten files
if (files.Length <= 10)
{
//check they are all valid
foreach (var file in files)
{
if (!ValidateFile(file))
{
allValid = false;
inValidFiles += ", " + file.FileName;
}
}
//if they are all valid then try to save them to disk
if (allValid)
{
foreach (var file in files)
{
try
{
SaveFileToDisk(file);
}
catch (Exception)
{
ModelState.AddModelError("FileName", "Sorry ,and error has occured saving the file to disk,please try again.");
}
}
}
//else add an error listing out the invalid files
else
{
ModelState.AddModelError("FileName", "All files must be gif,png,jpeg or jpg and less than 2mb in size.The following files" + inValidFiles + "are not valid");
}
}
//the user has entered more than 10 files
else
{
ModelState.AddModelError("FileName", "Please only upload up to ten files at a time");
}
}
//if the user has not entered a file return an error message
else
{
ModelState.AddModelError("FileName", "Please choose a file");
}
if (ModelState.IsValid)
{
bool duplicates = false;
bool otheDbError = false;
string dublicatesFiles = "";
foreach (var file in files)
{
//try and save each file
var productToAdd = new ProductImage { FileName = file.FileName };
try
{
db.ProductImages.Add(productToAdd);
db.SaveChanges();
}
//if there is an exception check if it is caused by a duplicate file
catch (DbUpdateException ex)
{
SqlException innException = ex.InnerException.InnerException as SqlException;
if (innException != null && innException.Number == 2601)
{
dublicatesFiles += ", " + file.FileName;
duplicates = true;
}
else
{
otheDbError = true;
}
}
}
//add a list of duplicate files to the error message
if (duplicates)
{
ModelState.AddModelError("FileName", "All files uploaded except the files" + dublicatesFiles + "which already exist in the system." + "please delete them and try again if you wish to re-add them");
return View();
}
else if (otheDbError)
{
ModelState.AddModelError("FileName","Sorry an error has occurred saving to the database ,please try again ");
return View();
}
}
return RedirectToAction("Index");
}
и это вспомогательные методы : ValidateFile () и SaveFileToDisk ()
private bool ValidateFile(HttpPostedFileBase file)
{
string FileExtension = System.IO.Path.GetExtension(file.FileName).ToLower();
string[] allowedFileTypes = { ".gif", ".png", ".jpeg", "jpg" };
if ((file.ContentLength > 0 && file.ContentLength < 2097152) && allowedFileTypes.Contains(FileExtension))
{
return true;
}
return false;
}
private void SaveFileToDisk(HttpPostedFileBase file)
{
WebImage img = new WebImage(file.InputStream);
if (img.Width > 190)
{
img.Resize(190, img.Height);
}
img.Save(Constants.ProductImagePath + file.FileName);
if (img.Width > 100)
{
img.Resize(100, img.Height);
}
img.Save(Constants.ProductThumbnailPath + file.FileName);
}
}
}
и я также обновил атрибут «несколько» на странице Upload.chtml, чтобы разрешить обновление нескольких файлов
<input type="file" name="files" id="files" multiple="multiple" class="form-control"/>
Теперь не имеет значения, что я делаю, загружая правильные или неправильные файлы, вместо того, чтобы показывать сообщение об ошибке или сохранять его в базе данных или на диске, это просто оправдывает последнюю строку кода, которая является
return RedirectToAction("Index");
и обратно на главную страницу, в чем проблема?