MVC中通过jquery实现图片预览上传,并对文件类型大小进行判断(极简)

Posted lfq761204

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVC中通过jquery实现图片预览上传,并对文件类型大小进行判断(极简)相关的知识,希望对你有一定的参考价值。

一、易出错问题重要提示

当直接通过提交表单数据上传文件时,文件上传控件input一定要添加name属性,并且不同的控件也要设置不同的name属性值,否则会导致控制器中的Request.Files方法获取上传文件失败。估计Request.Files方法是通过input控件的name属性来识别并区别上传文件的。

二、动态增减上传控件,多文件上传

视图代码

@{Layout=null;}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>MVC+jquery</title>
    <script src="~/Scripts/jquery.min.js"></script>
    <script>
        $(function() {
            var nameId=0;   //标识文件上传控件name属性值序列
            $("#AddInput").click(function() {
                //动态增减文件上传控件
                //上件上传input控件必须要添加name属性,不同控件的name值不能相同,否则会导致控件器中Request.Files方法获取上传文件失败。
                $("#FileControls").append("<p><input type='button' value='-' onclick=$(this).closest('p').remove() /> <input type='file' name='file"+toString(++nameId)+"' /></p>");
                //对文件上传控件添加onchange事件,验证文件类型、大小,并对符合要求的图片进行预览显示
                $("#FileControls :file").change(function() {
                    if($(this).val()=="") return;   //如果未选择文件则跳过不检查
                    //检测选择文件的类型,清除不符合类型要求的文件
                    if(!/(jpg|png|gif|jpeg)$/i.test($(this).val())) {
                        alert("请上传jpg、png、gif类型的图片文件!");
                        $(this).val("");    //清除不符合类型要求的文件
                        return;
                    }
                    //检测文件的大小,清除不符合类型要求的文件
                    if(this.files[0].size>500*1024) {   //500*1024为500K
                        alert("文件太大,请重新选择!");
                        $(this).val("");
                        return;
                    }
                    //这里的createObjectURL方法是针对chrome核心的浏览器,其它核心自行百度
                    var url=window.webkitURL.createObjectURL(this.files[0]);
                    $("#ImagePreview").attr("src",url);
                    $("#ImagePreview").css("display","block");
                });
            });
            $("#AddInput").click(); //向页面添加一个文件上传控件
        });
    </script>
</head>
<body>
    <form action="~/FileUpload/UploadSubmit" method="post" enctype="multipart/form-data">
        <div id="FileControls">
            <div>上传文件  <input type="button" style="width:80px;" id="AddInput" value="+" /></div>
        </div>
        <div><img id="ImagePreview" style="display:none;width:300px;border:1px;" onclick="this.style.display='none';" /></div>
        <input type="submit" value="直接提交表单数据上传" />
    </form>
</body>
</html>

控制器代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace XLZXXX.Controllers{
    public class FileUploadController : Controller{
        public ActionResult FileUploadSubmit(){
            return View();
        }
        public string UploadSubmit() {
            HttpFileCollectionBase files = Request.Files;
            int fileCount = 0;  //统计上传成功的文件个数
            for(int i = 0;i<files.Count;i++) {
                //跳过未选拔文件的input控件
                if(files[i]==null||files[i].ContentLength==0) continue;
                //上传文件,文件名与上传文件的文件名同名。也可以用Guid.NewGuid().ToString("N")全局唯一标识符来命名文件名
                files[i].SaveAs(Server.MapPath("~/upload/"+files[i].FileName));
                fileCount++;
            }
            return string.Format("【{0}】个文件上传成功",fileCount);
        }
    }
}

三、通过juqery的$.ajax异步上传

视图代码

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>MVC+jquery</title>
    <script src="~/Scripts/jquery.min.js"></script>
    <script>
        $(function() {
            //上传文件按钮的click事件
            $("#btnSubmit").click(function() {
                var hasFile=false;  //设置变量,记录是否选择文件
                var form=new FormData();
                //遍历文件上传控件,并将文件信息写入FormData对象
                $("#FileControls :file").each(function() {
                    if($(this).val()!="") {
                        //使用append方法将文件信息写入FormData对象,HTML代码中文件上传控件input可以无name属性,
                        form.append("file",$(this)[0].files[0]);
                        hasFile=true;
                    }
                });
                //如果一个文件都没有选择则跳出此函数
                if(!hasFile) {
                    alert("请至少选择一个上传的文件。"); return;
                }
                //上传文件,并返回以“,”连接的文件名,成功后返回文件名值、清空文件上传控件内容
                $.ajax({
                    url: "UploadAjax",type: "post",async: true,processData: false,contentType: false,
                    data: form,
                    success: function(data) {
                        alert(data+"上传成功");
                        $("#FileControls :file").val("");
                        $("#lblFiles").text(data);
                    },
                });
            });
        });
    </script>
</head>
<body>
    <p>文件:<label id="lblFiles"></label></p>
    <div id="FileControls">
        <p><input type="file" /></p>
        <p><input type="file" /></p>
    </div>
    <p><input type="button" id="btnSubmit" value="通过ajax上传文件并提交表单" /></p>
</body>
</html>

控制器代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace XLZXXX.Controllers{
    public class FileUploadController : Controller{
        public ActionResult FileUploadAjax() {
            return View();
        }
        //这是query的ajax调用的函数
        public string UploadAjax() {
            HttpFileCollectionBase files = Request.Files;
            //用List记录上传文件的文件名
            List<string> filesStr = new List<string>();
            for(int i = 0;i<files.Count;i++) {
                files[i].SaveAs(Server.MapPath("~/upload/"+files[i].FileName));
                filesStr.Add(files[i].FileName);
            }
            return string.Join(",",filesStr.ToArray());
        }
    }
}

四、单文件上传(无js代码)

视图代码

@{Layout=null;}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>MVC+jquery</title>
</head>
<body>
    <form action="~/FileUpload/UploadSingle" method="post" enctype="multipart/form-data">
        <p><input type="file" name="inputName" /></p>
        <input type="submit" value="单个文件上传" />
    </form>
</body>
</html>

控制器代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace XLZXXX.Controllers{
    public class FileUploadController : Controller{
        public ActionResult FileUploadSingle() {
            return View();
        }
        public string UploadSingle(HttpPostedFileBase inputName) {  //这里的参数名inputName一定要和视图里input文件上传控件的name属性值相同
            if(inputName==null) return "没有选择文件";
            inputName.SaveAs(Server.MapPath("~/upload/"+inputName.FileName));
            return "文件上传成功";
        }
    }
}

 

以上是关于MVC中通过jquery实现图片预览上传,并对文件类型大小进行判断(极简)的主要内容,如果未能解决你的问题,请参考以下文章

cropper动态裁剪图片(极简)

cropper动态裁剪图片(极简)

在 ASP.NET MVC 中通过 JQuery AJAX 上传文件

jQuery:[1]实现图片上传并预览

如何在 wordpress 中通过 jQuery/Ajax 上传图片

mvc视图中怎么上传图片并显示