Подтвердить что ты не робот

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

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

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

код:

[HttpPost]
    [Authorize]
    public ActionResult Create(Download dl, HttpPostedFileBase DownloadFile)
    {

и

@model Models.Download

@{
    ViewBag.Title = "Add Download";
}

<h3>Add Download</h3>

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

    <div class="editor-label">Download File</div>
    <div class="editor-field">
        <input name="DownloadFile" id="DownloadFile" type="file" />
        @Html.ValidationMessage("DownloadFile");
    </div>

    <div class="editor-label">@Html.LabelFor(model => model.Downloads)</div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Downloads)
        @Html.ValidationMessageFor(model => model.Downloads)
    </div>

    <div class="editor-label">@Html.LabelFor(model => model.DownloadDate)</div>
    <div class="editor-field">
        @Html.EditorFor(model => model.DownloadDate)
        @Html.ValidationMessageFor(model => model.DownloadDate)
    </div>

    <div class="display-field"><input type="submit" value="Add" /></div>
}

<div>@Html.ActionLink("Back To Downloads", "Index")</div>

Любые sugestions?

Спасибо, Алекс.

4b9b3361

Ответ 1

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

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

[HttpPost]
    [Authorize]
    public ActionResult Create([Bind(Exclude = "DownloadFile")] Download dl, HttpPostedFileBase DownloadFile)
    {

Сообщая модельному связующему, чтобы исключить поле, оно решило проблему.

Спасибо, Алекс.

EDIT: это также можно легко решить, используя модели просмотра

Ответ 2

Алекс, вы частично правы с вашей оценкой. Причина, по которой он терпит неудачу, когда у вас есть свойство с тем же именем в вашей модели, что и имя входного объекта в форме, связано с тем, что DataType сопоставимого свойства на вашей модели не является System.Web. HttpPostedFileWrapper, который является типом данных, который двоичное связующее будет пытаться выполнить привязку.

Исключая ваше свойство, используя атрибут Bind, а затем извлекая файл из коллекции Request.Files, как вы показали, может работать, но может быть более элегантным, чтобы связующее выполняло свою работу (при условии, что тип данных соответствует Я упомянул выше), а затем вы можете просто получить доступ к файлу непосредственно из свойства вашей модели.

Ответ 3

Вы можете попробовать удалить HttpPostedFileBase из метода контроллера и использовать Request.Files [0] и посмотреть, не изменилось ли это.

Честно говоря, хотя я не понимаю, почему это произойдет, если в вашей модели не будет чего-то, что вызывает его.

Кроме того, здесь нужно выбрать nit, но DownloadFile должен быть загружен в вашей форме и в вашем методе контроллера.