【问题标题】:The input is not a valid Base-64 string as it contains a non-base 64 character?输入不是有效的 Base64 字符串,因为它包含非 base 64 字符?
【发布时间】:2011-02-26 04:16:38
【问题描述】:

我有一个表单,用户可以在其中将文件上传到网站下载部分。但是,当提交表单时,我收到此错误,而请求却没有发送到操作方法。

“输入不是有效的 Base-64 字符串,因为它包含非 base 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>

有什么建议吗?

谢谢, 亚历克斯。

【问题讨论】:

    标签: c# file-upload asp.net-mvc-3


    【解决方案1】:

    好吧,我终于想通了,这都是因为我将表单上的文件输入命名为与我的模型文件字段相同,所以模型绑定器正在选择它并尝试将发布的文件直接绑定到二进制文件由于字符串不是二进制而引发异常的属性。

    所以为了修复它,我只是将它添加到我的创建操作方法中:

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

    通过告诉模型绑定器排除它解决了问题的字段。

    谢谢, 亚历克斯。

    编辑:这也可以通过使用视图模型轻松解决

    【讨论】:

    • 非常感谢!你知道为什么 binder 不能绑定这个属性吗?
    • 因为我模型上的字段不是 HttpPostedFileBase 类型,它试图直接绑定到“Download”模型而不是 HttpPostedFileBase 参数“DownloadFile”
    • 我明白了,我的意思是为什么binder无法将上传的文件直接绑定到DownloadFile属性?是缺乏功能还是有理由不这样做?
    • 当然,如果binder确定属性的类型,将文件转换为字节数组,我认为这将是一件好事。
    • +1 你有没有觉得你刚刚拯救了别人的一天?
    【解决方案2】:

    Alex,您的评估部分正确。当模型上的属性与表单上的输入对象的名称同名时,它失败的原因是模型上匹配命名的属性的 DataType 不是 System.Web。 HttpPostedFileWrapper 这是二进制绑定器将尝试执行绑定的数据类型。

    通过使用 Bind 属性排除您的属性,然后如您所演示的那样从 Request.Files 集合中提取文件可能有效,但让活页夹完成它的工作可能更优雅(前提是数据类型匹配为我在上面提到过)然后您可以直接从模型的属性中直接访问该文件

    【讨论】:

    • 在这种情况下,我没有使用视图模型,而是直接绑定到数据库实体模型。如果我使用视图模型,我会更改数据类型以匹配活页夹数据类型。
    【解决方案3】:

    您可以尝试从控制器方法中删除 HttpPostedFileBase 并使用 Request.Files[0] 看看是否会有所不同。

    老实说,虽然我不明白为什么这会失败,除非你的模型中存在导致它的原因。

    此外,这里不提,但 DownloadFile 应该是您的表单和控制器方法中的 downloadFile。

    【讨论】:

    • 大声笑,谢谢您,在您回答时从字面上解决了这个问题,更改了表单字段名称并且它立即起作用,这使我得出结论,模型绑定器正在执行此操作。你的挑剔会解决问题哈哈。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2012-09-22
    • 1970-01-01
    • 2020-11-22
    • 2021-07-16
    相关资源
    最近更新 更多