Невозможно проверить и загрузить несколько изображений - PullRequest
0 голосов
/ 08 ноября 2018

Мне удалось успешно загрузить одно изображение, и процессы проверки и загрузки прошли нормально, но, поскольку я пытался загрузить несколько изображений, ни проверка, ни загрузка не были выполнены.

это модель , называемая «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");

и обратно на главную страницу, в чем проблема?

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