当前位置: 首页 > news >正文

健忘者系列-MVC图片上传(二)

上一篇我们说了不用插件,不用异步上传一个文件和多个文件,这一篇我们用jquery.form.js表单插件来实现异步和多个上传。

引用插件

<script src="~/Scripts/js/jquery.min.js"></script>
<script src="~/Scripts/js/jquery.form.js"></script>

备注:先是引入jquery库然后再引入插件。

一个图片上传

我们先说一下异步上传一个文件,然后在后台返回图片的url,在表单上显示图片。

客户端代码

    <div class="row-fluid">
        <div class="span5">
            <div class="widget-box">
                <div class="widget-title">
                    <span class="icon"> <i class="icon-align-justify"></i> </span>
                    <h5>异步单个上传</h5>
                </div>
                <div class="widget-content nopadding">
                    <form id="form-yibu" action="/Upload/Up3_Handle" method="POST" class="form-horizontal" enctype="multipart/form-data">
                        <div class="control-group">
                            <label class="control-label">姓名 :</label>
                            <div class="controls">
                                <input type="text" name="name" class="span5" placeholder="请输入姓名">
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label">头像 :</label>
                            <div class="controls">
                                <input type="file" name="image" class="span5" placeholder="请选择图片">
                            </div>
                        </div>
                        <div class="control-group" tag="imgView">
                            <label class="control-label">预览 :</label>
                            <div class="controls">
                                <img alt="" id="result" src="" width="100" height="100" />
                            </div>
                        </div>
                        <div class="form-actions">
                            <a href="javascript:void(0)" class="btn btn-success" tag="submit">提交</a>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>

备注:我们form表单的idform-yibu,返回展示图片的idresult,提交我们用了a标签。

JavaScript代码

<script>
    $(document).ready(function () { 
        $("[tag='imgView']").hide(); 
        $("[tag='submit']").click(function () {
            var options = {
                success: function (data) {
                    if (data.pic == "") {
                        alert(data.error);
                    } else {
                        $("#result").attr("src", data.pic);
                        $("[tag='imgView']").show();
                    }
                }
            };
            //$("#form-yibu").ajaxSubmit(options);
            $(this).parents("form").ajaxSubmit(options);
        });
    });
</script>

备注:这里我们假如不想在form表单加上id可以这样写$(this).parents("form").ajaxSubmit(options);,但要注意层次的嵌套。options是用来处理返回的内容和错误的信息的,在提交的时候用作ajaxSubmit的参数。

后台服务器代码

服务器处理的方式跟之前的差不多,也是有两种方法。

第一种

        [HttpPost]
        public ActionResult Up3_Handle(string name)
        {
            //HttpPostedFileBase file = Request.Files["image"];
            HttpPostedFileBase file = Request.Files[0];
            string pic = "", error = "";
            if (null != file && file.ContentLength != 0)
            {
                string filePath = Path.Combine(Server.MapPath("~/UploadPic"), file.FileName);
                file.SaveAs(filePath);
                pic = "/UploadPic/" + file.FileName;
            }
            return Json(new { pic = pic, error = error });
        }

第二种

        [HttpPost]
        public ActionResult Up3_Handle(HttpPostedFileBase image, string name)
        {
            string filePath = Path.Combine(Server.MapPath("~/UploadPic"), image.FileName);
            string pic = "", error = "";
            try
            {
                image.SaveAs(filePath);
                pic = "/UploadPic/" + image.FileName;
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }
            return Json(new { pic = pic, error = error });
        }
备注:我们这里是用json返回图片路径和错误信息。

效果



多个图片上传

多个图片上传我要增加添加多个图片的方法和展示多个图片的方法,后台一样是返回多个图片的路径。

客户端代码

    <div class="row-fluid">
        <div class="span5">
            <div class="widget-box">
                <div class="widget-title">
                    <span class="icon"> <i class="icon-align-justify"></i> </span>
                    <h5>异步多个上传</h5>
                </div>
                <div class="widget-content nopadding">
                    <form action="/Upload/Up3s_Handle" method="POST" class="form-horizontal" enctype="multipart/form-data">
                        <div class="control-group">
                            <label class="control-label">姓名 :</label>
                            <div class="controls">
                                <input type="text" name="name" class="span5" placeholder="请输入姓名">
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label">头像 :</label>
                            <div class="controls">
                                <input type="file" name="image" class="span5" placeholder="请选择图片">
                                <a href="javascript:void(0)" class="btn btn-mini btn-info" tag="add"> <i class="icon-plus"></i> </a>
                            </div>
                        </div>
                        <div class="control-group" tag="imgView2">
                            <label class="control-label">预览 :</label>
                            <div class="controls" tag="imgView2-controls">
                                <img alt="" id="result" src="" width="100" height="100" />
                            </div>
                        </div>
                        <div class="form-actions">
                            <a href="javascript:void(0)" class="btn btn-success" tag="submit2">提交</a>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
备注:这里我们用tag="add"处理添加多个文件,tag="imgView2"用来展示图片。

JavaScript代码

<script>
    $(document).ready(function () {
        $("[tag='imgView2']").hide();
        var taghtml = "<div class=\"control-group\"><label class=\"control-label\">头像 :</label><div class=\"controls\"><input type=\"file\" name=\"images\" class=\"span5\" placeholder=\"请选择图片\"> <a href=\"javascript:void(0)\" class=\"btn btn-mini btn-danger remove\"> <i class=\"icon-minus\"></i> </a></div></div>";
        //添加内容
        $("[tag='add']").click(function () {
            $(this).parent().parent().after(taghtml);
            //删除内容
            $(".remove").click(function () {
                $(this).parent().parent().remove();
            });
        });
        $("[tag='submit2']").click(function () {
            var options = {
                success: function (data) {
                    if (data.Data == "") {
                        alert(data.ErrorMessage);
                    } else {
                        var imgHtml = "";
                        $.each(data.Data, function (i, val) {
                            imgHtml += "<img alt=\"\" id=\"result\" src=\"" + val.Url + "\" width=\"100\" height=\"100\" /> ";
                        });
                        $("[tag='imgView2-controls']").empty().append(imgHtml);
                        $("[tag='imgView2']").show();
                    }
                }
            }; 
            $(this).parents("form").ajaxSubmit(options);
        }); 
    });
</script>
备注:这里提交和单个提交是一样的,这里展示的时候我就用返回的json拼接了多个img元素,以后我们都会讲到一些不需要自己写增加多文件和展示的插件,我们一步一步来,等待后续吧。

后台服务器代码

服务器处理的时候也是有两种方法,其实处理和上一篇说的多个文件处理是没多大区别,只是增加了返回的json。

方法一

        [HttpPost]
        public ActionResult Up3s_Handle()
        { 
            var liu=new List<ImgUrl>();
            if (Request.Files != null && Request.Files.Count > 0)
            {
                for (int i = 0; i < Request.Files.Count; i++)
                {
                    HttpPostedFileBase file = Request.Files[i];
                    if (file.ContentLength == 0) continue;
                    string filePath = Path.Combine(Server.MapPath("~/UploadPic"), file.FileName);
                    file.SaveAs(filePath);

                    liu.Add(new ImgUrl() {Url = "/UploadPic/" + file.FileName});
                }
            }
            return Json(new AjaxResultModel<List<ImgUrl>> { Data = liu });
        }

备注:这里 AjaxResultModelImgUrl是我自己随便写的两个 model,用来包装数据更好的返回 json格式而已。下面也贴出来吧。

    public class AjaxResultModel<T>
    {
        public AjaxResultModel()
        {
            ErrorMessage = string.Empty;
        }

        /// <summary>
        ///     数据对象
        /// </summary>
        public T Data { get; set; }
        /// <summary>
        ///     错误数量
        /// </summary>
        public int Errors { get; set; }
        /// <summary>
        ///     错误信息
        /// </summary>
        public string ErrorMessage { get; set; } 
    }
    public class ImgUrl
    {
        public string Url { get; set; }
        public string Error { get; set; }
    }

方法二

        [HttpPost]
        public ActionResult Up3s_Handle(IEnumerable<HttpPostedFileBase> images, string name)
        {
            var liu = new List<ImgUrl>();
            if (images != null && images.Any())
            {
                foreach (HttpPostedFileBase file in images)
                {
                    if (file.ContentLength == 0) continue;
                    string filePath = Path.Combine(Server.MapPath("~/UploadPic"), file.FileName);
                    file.SaveAs(filePath);
                    liu.Add(new ImgUrl() { Url = "/UploadPic/" + file.FileName });
                }
            }
            return Json(new AjaxResultModel<List<ImgUrl>> { Data = liu });
        }

备注:其实后台接收的方法都是大同小异,关键是表单的名字要对上就行了。

效果


废话

细心的朋友可能会发现,上一篇是Up1的方法,现在是Up3的方法,是不是没有写Up2呢?其实是有的,本来我先第二篇说一下用ajaxfileupload.js来实现异步上传的,但是研究一下发现ajaxfileupload.js不太好用,也好久没更新了,对多个文件上传的处理也不太好,返回结果和mvc也不太兼容。网上虽然有人写了一些扩展实现对ajaxfileupload.js的多个文件上传的支持和绑定name上传,不用绑定id了,但我想想还是不说了,后面还有很多更加新的插件要说。

链接

上面在添加多个上传项的时候没有详细说明怎么实现,我这里有一篇是专门说这个的有兴趣的朋友可以去看看。Go







相关文章:

  • mybatis-plus 代码生成器使用
  • java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to ***
  • you *might* want to use the less safe log_bin_trust_function_creators variable
  • node.js websocket.io 搭建 websocket 通信服务
  • Mysql 定时器
  • mysql 存储过程 遍历
  • mysql复制表结构的几种方式
  • TO_CHAR 和 TO_DATE的一些用法
  • Spark:学习笔记
  • linux:常用基本命令
  • Spark:数据倾斜处理一般从什么地方入手
  • MapReduce:中map和reduce的数量设置问题
  • MapReduce: 计数器(Counter)
  • Hive:HiveQL中如何排查数据倾斜问题
  • Java:字符序列:String,StringBuilder,StringBuffer三者的区别
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • ERLANG 网工修炼笔记 ---- UDP
  • HTML5新特性总结
  • Javascripit类型转换比较那点事儿,双等号(==)
  • js中forEach回调同异步问题
  • Laravel Telescope:优雅的应用调试工具
  • Service Worker
  • Zepto.js源码学习之二
  • 闭包--闭包之tab栏切换(四)
  • 构建工具 - 收藏集 - 掘金
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 人脸识别最新开发经验demo
  • 数据仓库的几种建模方法
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 译米田引理
  • 译有关态射的一切
  • 第二十章:异步和文件I/O.(二十三)
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #每天一道面试题# 什么是MySQL的回表查询
  • (2)MFC+openGL单文档框架glFrame
  • (vue)页面文件上传获取:action地址
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .Net 路由处理厉害了
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .skip() 和 .only() 的使用
  • [4.9福建四校联考]
  • [BSGS算法]纯水斐波那契数列
  • [Bugku]密码???[writeup]
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [IE编程] IE8的SDK 下载
  • [NowCoder]牛客OI周赛3
  • [paper] lift,splat,shooting 论文浅析