Загрузка разных типов файлов для разных свойств модели - PullRequest
1 голос
/ 23 июня 2009

У меня есть модель со свойствами ImagePath и PDFPath.

Когда они нажимают сохранить, это вызывает метод действия POST в контроллере. Мне нужно проверить, что они загружены только файлы изображений и PDF-файлов. Если они загрузили что-то отличное от этих типов файлов, я хочу установить ошибку ModelState со следующим:

ModelState.AddModelError("ImagePath", "Only image files are accepted");
ModelState.SetModelValue("ImagePath", new ValueProviderResult(null, null, null));

Проблема в том, что мне нужно установить правильные свойства в AddModelError. Проблема в том, что они могли поместить файл * .doc в ImagePath или PDFPath, поэтому я не знаю, какой из них сообщить в качестве поля ошибки.

Как мне также убедиться, что они загружают только типы файлов ceratin? RegEx

Спасибо

РЕДАКТИРОВАТЬ: Вот мой код контроллера.

[AcceptVerbs(HttpVerbs.Post)]
    [Authorize]
    public ActionResult Create([Bind(Prefix = "", Exclude = "ID")] News item)
    {
        string imageUrl = "";
        string pdfurl = "";

        try
        {
            News.CheckForErrors(item);
        }
        catch (RulesException ex)
        {
            ex.AddModelStateErrors(ModelState, null);
        }

        foreach (string inputTagName in Request.Files)
        {
            HttpPostedFileBase file = Request.Files[inputTagName];
            if (file.ContentLength > 0)
            {
                string filePath = Path.Combine(HttpContext.Server.MapPath("/uploads"), Path.GetFileName(file.FileName));
                if (Path.GetExtension(file.FileName).ToLower() != ".jpg" || Path.GetExtension(file.FileName).ToLower() != ".pdf")
                {
                    //HELP! - Which model has the property error ImagePath/PDFPath?
                    ModelState.AddModelError("ImagePath", "Only JPG image files are accepted");
                    ModelState.SetModelValue("ImagePath", new ValueProviderResult(null, null, null));
                    break;
                }

                imageUrl = "/uploads/" + file.FileName;
            }
        }

        if (!ModelState.IsValid)
        {

                return View(item);

        }

        try
        {
            item.Save(User.Identity.Name);

        }
        catch (Exception x)
        {

        }



        return RedirectToAction("Index");

    }

1 Ответ

1 голос
/ 24 июня 2009

Вам нужно что-то вроде метода GetFileByExtension ():

HttpPostedFileBase GetFileByExtension(HttpFileCollectionBase files, string[] extensions)
{
    Func<string, bool> extensionIsValid =
        fileExtension => extensions.Any(
            extension => String.Compare(extension, fileExtension, true) == 0
        );

    return files.Cast<string>().Select(x => files[x]).Single(
        file => extensionIsValid(System.IO.Path.GetExtension(file.FileName))
        );
}

или

IList<HttpPostedFileBase> GetAllFilesByExtension(HttpFileCollectionBase files, string[] extensions)
{
    Func<string, bool> extensionIsValid =
        fileExtension => extensions.Any(
            extension => String.Compare(extension, fileExtension, true) == 0
        );

    return files.Cast<string>().Select(x => files[x]).Where(
        file => extensionIsValid(System.IO.Path.GetExtension(file.FileName))
        ).ToList();
}

пример:

var imageFile = GetFileByExtension(Request.Files,
                                   new [] { ".jpg", ".gif", ".png", ".bmp" });

var pdfFile = GetFileByExtension(Request.Files, new [] { ".pdf" });

или

var imageFiles = GetAllFilesByExtension(Request.Files,
                                   new [] { ".jpg", ".gif", ".png", ".bmp" });

var pdfFiles = GetAllFilesByExtension(Request.Files, new [] { ".pdf" });

ОБНОВЛЕНИЕ:

Возможно, вам следует попробовать загрузить с использованием отдельных форм / действий для разных загрузок (что-то вроде / upload / create? Newsid = 1? Uploadtype = изображение для изображений и / upload / create? Newsid = 1? Uploadtype = pdf для PDF-файлов) Ваше действие Upload.Create может выглядеть так:

public class UploadController : Controller
{
    public ActionResult Create(int newsId, string uploadType)
    {
        if(uploadType == "image")
        {
            // uploading only images
            var imageFiles = GetAllFilesByExtension(Request.Files, new [] { ".jpg", ".gif", ".png", ".bmp" });
            ...
        }
    }
}

В этом случае вы всегда знаете тип файлов, которые следует загрузить в действие

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