您的位置:首页 > 理论基础 > 计算机网络

7_文件上传实例

2015-06-23 16:31 701 查看

前言

本文介绍简单的单文件上传,并解决了HttpPostedFileBase为空的问题。

系统设计中使用了MVC的Anotation验证。

view界面是采用
Html.BeginForm
的形式

介绍步骤详解

View设置

@using (Html.BeginForm("Upload","Admin",FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
///标题字段的输入和验证
@Html.LabelFor(model => model.Title)
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)

///上传图片字段的验证
@Html.LabelFor(model => model.ImgUrl)
@Html.TextBo
4000
xFor(model => model.ImgUrl,
new { @type="file"})
@Html.ValidationMessageFor(model => model.ImgUrl)

//上传按钮
<input type="submit" value="确认添加" />
}


Controller Action设置

[HttpPost]
public ActionResult Upload(Picture pic)
{
///【注1】这样写是为了避免HttpPostedFileBase为空的问题
HttpPostedFileBase image = Request.Files["ImgUrl"];
if (image != null && image.ContentLength > 0)
{
///【注2】这里的文件路径名一定要合格,符合文件名规范。
///否则image.SaveAs(filePath);这句代码会报错。
string fileName =  DateTime.Now.ToString("yyyyMMddmmssfff") + "-" + Path.GetFileName(image.FileName);

string filePath = Path.Combine(Server.MapPath("~/Upload"), fileName);
image.SaveAs(filePath);
pic.ImgUrl = "~/Upload/" + fileName;
///此处将pic信息保存到数据库
return this.View();
}
}


注意点

View界面要设置:
FormMethod.Post, new { enctype = "multipart/form-data" }


不要将
HttpPostedFileBase image
以参数的形式传递进来,会造成
image
为空,拿不到数据。建议采用
Request.Files
的方式获取图片,
HttpPostedFileBase image = Request.Files["ImgUrl"];
即ImgUrl为View页面的Name属性值

Chrome界面上传的文件 不带路径名,而IE会带路径名,如果你不采用上述方法获取路径名,而是通过pic.ImgUrl的方式,采用以下代码兼容

private String getImgUrl(String url)
{
String imgUrl = url;
if (url.LastIndexOf("\\") > -1)
{
imgUrl = url.Substring(url.LastIndexOf("\\") + 1);
}
return imgUrl;
}


文件保存在服务器上的名字要求不同不然不同用户上传的文件会覆盖。造成数据的丢失错乱。 如果保存的文件名格式错误,还会在下面

image.SaveAs(filePath);这里报错,有不少人遇到这个问题。

显示效果(上面没有给出CSS代码)



小结

本文介绍了MVC下文件上传的小Demo,解决了HttpPostedFileBase为空的问题,顺便提了一些其他经常遇到的问题,文件名不重复,浏览器不同,拿到的路径名不同以及 image.SaveAs(filePath)报错问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息