输入不是有效的Base-64字符串,因为它包含非基本64字符?

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

“输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非空白字符。”

码:

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

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

Add Download

@using (Html.BeginForm("Create", "Download", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.ValidationSummary(true)
Download File
@Html.ValidationMessage("DownloadFile");
@Html.LabelFor(model => model.Downloads)
@Html.EditorFor(model => model.Downloads) @Html.ValidationMessageFor(model => model.Downloads)
@Html.LabelFor(model => model.DownloadDate)
@Html.EditorFor(model => model.DownloadDate) @Html.ValidationMessageFor(model => model.DownloadDate)
}
@Html.ActionLink("Back To Downloads", "Index")

任何sugestions?

谢谢,Alex。

好吧我终于弄清楚了,这都是因为我将表单上的文件输入命名为与我的模型文件字段相同,所以模型绑定器正在拾取它并尝试将发布的文件直接绑定到二进制属性因为字符串不是二进制而抛出exception。

所以要修复它我只是将它添加到我的create action方法:

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

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

谢谢,Alex。

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

亚历克斯,你的评估部分正确。 当您在模型上具有与表单上的输入对象的名称相同的属性时,它失败的原因是由于模型上匹配命名属性的DataType不是System.Web。 HttpPostedFileWrapper,它是binary-binder将尝试执行绑定的数据类型。

通过使用Bind属性排除您的属性,然后从您展示的Request.Files集合中提取文件可能有效,但让绑定器执行其操作可能更优雅(假设数据类型匹配,如上所述) )然后您可以直接从模型的属性访问该文件

您可以尝试从控制器方法中删除HttpPostedFileBase并使用Request.Files [0]并查看是否会产生影响。

老实说虽然我不知道为什么这会失败,除非在你的模型中有一些东西导致它。

另外,在这里挑选,但是DownloadFile应该在你的表单和控制器方法中下载文件。