我有一个表单,用户可以将文件上传到网站下载部分。但是,当提交表单时,我收到此错误,而没有请求进入操作方法。
“输入不是有效的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?
谢谢, 亚历克斯。
答案 0 :(得分:30)
好的,我终于弄清楚了,这一切都是因为我将表单上的文件输入命名为与我的模型文件字段相同,所以模型绑定器正在拾取它并试图将发布的文件直接绑定到二进制文件因为字符串不是二进制而抛出异常的属性。
所以为了解决这个问题,我只是将其添加到我的创建操作方法中:
[HttpPost]
[Authorize]
public ActionResult Create([Bind(Exclude = "DownloadFile")] Download dl, HttpPostedFileBase DownloadFile)
{
通过告诉模型绑定器排除字段,它解决了问题。
谢谢, 亚历克斯。
编辑:这也可以通过使用视图模型轻松解决
答案 1 :(得分:4)
通过使用Bind属性排除您的属性,然后从您展示的Request.Files集合中提取文件可能有效,但让绑定器执行其操作可能更优雅(假设数据类型匹配为我在上面提到过)然后您可以直接从模型的属性
访问该文件答案 2 :(得分:1)
您可以尝试从控制器方法中删除HttpPostedFileBase并使用Request.Files [0]并查看是否有所不同。
老实说虽然我不知道为什么这会失败,除非在你的模型中有某些东西导致它。
另外,在这里挑选,但是DownloadFile应该在你的表单和控制器方法中下载文件。