7_文件上传实例


前言


  • 本文介绍简单的单文件上传,并解决了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.TextBoxFor(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)报错问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值