ASP.NET MVC解决上传图片脏数据的方法的完整攻略如下:
- 首先,在Model中定义一个byte[]类型的属性来存储图片数据。在Models文件夹中,打开要添加图片属性的类,然后以下代码:
public class MyModel
{
public byte[] ImageData { get; set; }
}
- 接下来,在View中添加一个文件上传控件,并将其与Model中的图片属性绑定。在Views文件夹,打开要添加文件上传控件的视图,然后添加以下代码:
<div class="form-group">
@Html.LabelFor(model => model.ImageData, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<input type="file" name="ImageData" />
@Html.ValidationMessageFor(model => model.ImageData, "", new { @class = "text-danger" })
</div>
</div>
这里使用了Html.LabelFor和Html.ValidationMessageFor两个辅助方法。Html.LabelFor方法会自动根据Model中的属性生成相应的标签,而Html.ValidationMessageFor方法会自动显示Model中的属性验证错误信息。
- 在Controller中添加一个Action来处理文件上传。在Controllers文件夹中,打开要添加Action的Controller,然后添加以下:
[HttpPost]
public ActionResult Upload(MyModel model)
{
if (ModelState.IsValid)
{
if (model.ImageData != null && model.ImageData.Length > 0)
{
// 将图片数据转换为Base64字符串
string base64String = Convert.ToBase64String(model.ImageData);
// 将Base64字符串转换为字节数组
byte[] imageData = Convert.FromBase64String(base64String);
// 保存图片数据到数据库或文件系统
...
return RedirectToAction("Success");
}
else
{
ModelState.AddModelError("", "请选择要上传的图片");
}
}
return View(model);
}
在上面的代码中,我们首先判断ModelState.IsValid属性来判断Model中的属性是否通过验证。如果验证通过,我们再判断图片数据为空,如果不为空,就将其转换为Base64字符串,并将其保存到数据库或文件系统中。如果图片数据为空,就显示错误信息“请选择要上传的图片”。
- 最后,在View中添加一个显示图片的标签。在Views文件夹,打开要添加显示图片的视图,然后添加以下代码:
@if (Model.ImageData null && Model.ImageData.Length > 0)
{
<img src="data:image/png;base64,@Convert.ToBase64String(Model.ImageData)" />
}
这里使用了data URI scheme来显示图片。data URI scheme是一种将小型数据嵌入到文档中的方法可以将图片数据直接嵌入到HTML文档中,而不需要从服务器上加载图片文件。
以下是两个示例:
- 如果用户上传的文件不是图片文件,就会显示错误信息“请选择要上传的图片”。
[HttpPost]
public ActionResult Upload(MyModel model)
{
if (ModelState.IsValid)
{
if (model.ImageData != null && model.ImageData.Length > 0)
{
// 判断文件类型是否为图片
if (model.ImageData.ContentType != "image/jpeg" && model.ImageData.ContentType != "image/png")
{
ModelState.AddModelError("", "请选择图片文件");
return View(model);
}
// 将图片数据转换为Base64字符串
string base64String = Convert.ToBase64String(model.ImageData);
// 将Base64字符串转换为字节数组
byte[] imageData = Convert.FromBase64String(base64String);
// 保存图片数据到数据库或文件系统
...
return RedirectToAction("Success");
}
else
{
ModelState.AddModelError("", "请选择要上传的图片");
}
}
return View(model);
}
在上面的代码中,我们添加了一个判断文件类型的逻辑。如果文件类型不是图片,就显示错误信息“请选择图片文件”。
- 如果用户上传的是一张图片,就会将其保存到或文件系统中,并在下一个页面中显示该图片。
@if (Model.ImageData null && Model.ImageData.Length > 0)
{
<img src="@Url.Action("GetImage", "Home", new { id = Model.Id })" />
}
在上面的代码中,我们使用了Url.Action方法来生成一个URL,该URL指向一个Action,用于获取图片数据。在HomeController中,我们添加了一个名为GetImage的Action,用于获取图片数据并将其返回给客户端。
public ActionResult GetImage(int id)
{
MyModel model = db.MyModels.Find(id);
if (model != null && model.ImageData != null && model.ImageData.Length > 0)
{
return File(model.ImageData, "image/png");
}
else
{
return HttpNotFound();
}
}
在上面的代码中,我们首先从数据库中获取指定ID的Model对象,然后判断其图片数据是否为空。如果图片数据不为空,就将其返回给客户端。如果图片数据为空,就返回一个HttpNotFound结果。