Ошибка загрузки изображения ASP MVC «Введенная строка не является допустимой строкой Base-64»

У меня есть эта форма, где я пытаюсь загрузить изображение. Когда я нажимаю кнопку отправки, я получаю следующую ошибку:

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

Контроллер никогда не достигается, так как ошибка возникает, как только я загружаю изображение. Я в недоумении, что делать. Любая помощь приветствуется!

@using (Html.BeginForm("Create", "Create", FormMethod.Post, new { enctype = "multipart/form-data"})) 
{
    @Html.AntiForgeryToken()

    <div class="form-group">
        <div class="col-md-10">
            @Html.LabelFor(model => model.ComponentModel.Image, htmlAttributes: new {@class = "control-label col-md-2"})
            <a class="btn" href="javascript:;">
                Choose File...
                <input type="file" name="Image" Size="40" style="position: absolute; z-index: 2; top: 0; left: 0; filter: alpha(opacity=0); opacity: 0; background-color: transparent; color: transparent"
                       onchange='$("#upload-file-info").html($(this).val());'/>
            </a>
            <span class="label label-info" id="upload-file-info"></span>
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default"/>
        </div>
    </div>
}

ОБНОВИТЬ:

Это контроллер создания:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Component component, HttpPostedFileBase image = null)
    {
        if (ModelState.IsValid)
        {
            if (image != null)
            {
                component.Image = new byte[image.ContentLength];
                image.InputStream.Read(component.Image, 0, image.ContentLength);
            }
            componentRepository.InsertComponent(component);
            componentRepository.Save();
            return RedirectToAction("Index", "Home");
        }
        return RedirectToAction("Index", component);
    }

person Khaine775    schedule 12.11.2015    source источник


Ответы (2)


Вы действительно не предоставили здесь достаточно информации, но я собираюсь предположить, основываясь на сообщении об ошибке.

Вы говорите, что он не попадает в ваш контроллер, но он должен попасть в ваш контроллер. Ошибка исходит от ASP.NET, поэтому она возвращается на сервер.

Вы привязали ввод файла к Image, и я предполагаю, что Image — это массив байтов в вашей модели. Вы не можете отправлять сообщения непосредственно в массив байтов. Вам нужно привязаться к свойству типа HttpPostedFileBase, из которого вы можете затем прочитать массив байтов и установить его для другого вашего свойства.

person Chris Pratt    schedule 12.11.2015
comment
Я обновил OP с помощью контроллера. Я уже думал о том, что вы предлагаете, но, к сожалению, это ничего не изменило. Если я поставлю точку останова в контроллере, она никогда не сработает. - person Khaine775; 12.11.2015
comment
Это связано с тем, что ошибка генерируется связывателем модели до того, как она фактически попадет в ваш код действия. Поскольку у вас есть свойство Component с именем Image, средство связывания моделей пытается связать данные там, что и вызывает ошибку. Тот факт, что у вас есть еще один параметр с именем image, никогда не играет роли. Вам нужно использовать имя для входа (и параметра), которое отличается от всего в вашей модели. - person Chris Pratt; 12.11.2015
comment
Я добавил в модель свойство HttpPostedFileBase, которое избавило меня от ошибки и позволило загрузить файл. Каковы будут дальнейшие действия здесь? Преобразование параметра HttpPostedFileBase в byte[] и его сохранение? - person Khaine775; 12.11.2015
comment
Если модель является вашей сущностью, у вас не должно быть свойства HttpPostedFileBase. Либо используйте модель представления, либо привяжите ее к дополнительному параметру, как вы пытались сделать ранее. Однако да, когда у вас есть опубликованный файл, вам нужно прочитать байты из потока и установить для него соответствующее свойство в вашей модели. - person Chris Pratt; 12.11.2015

public HttpPostedFileBase image { get; set; } Используйте его в своей модели <input type="file" name="image" /> Используйте его в своей опоре имени представления, которая должна быть такой же, как изображение HttpPostedFileBase, и поймайте его в методе публикации и после преобразования в байт

person suyash narhare    schedule 14.04.2020