Автоматическая привязка входного файла к массиву byte [] в ASP.NET MVC - PullRequest
0 голосов
/ 21 июля 2010

Кому-нибудь удалось получить механизм связывания по умолчанию для работы с элементом управления входным файлом и свойством типа байтового массива?

Если у меня есть свойство в моей ViewModel с именем Image и элемент управления вводом файлов в моем представлении с именем Image, по умолчаниюсвязыватель выдаст эту ошибку:

Введенная строка не является допустимой строкой Base-64, так как содержит не базовый 64-символ, более двух символов заполнения или непустой пробел среди заполнения.символы.

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

Зачем вам массив byte[]?Связыватель модели по умолчанию работает с HttpPostedFileBase :

<% using (Html.BeginForm("upload", "home", FormMethod.Post, new { enctype = "multipart/form-data" })) { %>
    <input type="file" name="file" id="file" />
    <input type="submit" value="Upload" />
<% } %>

И действием контроллера, которое будет обрабатывать это:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    if (file.ContentLength > 0) 
    {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
        file.SaveAs(path);
    }
    return RedirectToAction("Index");
}

Это также работает с несколькими файлами.Вы просто используете IEnumerable<HttpPostedFileBase> в сигнатуре метода действия.

0 голосов
/ 27 августа 2018

Вам следует создать пользовательский механизм связывания модели, который напрямую связывает загруженный файл с полем байта [] в вашей модели.

Пример:

public class CustomByteArrayModelBinder : ByteArrayModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var file = controllerContext.HttpContext.Request.Files[bindingContext.ModelName];

        if (file != null)
        {
            if (file.ContentLength > 0)
            {
                var fileBytes = new byte[file.ContentLength];
                file.InputStream.Read(fileBytes, 0, fileBytes.Length);
                return fileBytes;
            }

            return null;
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

Вы также должны удалить привязку модели по умолчанию и добавить свою (в Global.asax.cs, внутри метода Application_Start):

ModelBinders.Binders.Remove(typeof(byte[]));
ModelBinders.Binders.Add(typeof(byte[]), new CustomByteArrayModelBinder());

Этот код был удален из этой хорошей статьи: http://prideparrot.com/blog/archive/2012/6/model_binding_posted_file_to_byte_array

С наилучшими пожеланиями:)

...