图片预览并异步上传

有些信息展示需要图片,如个人证件等,可以由用户自行上传,本文试用原生js实现客户端图片预览,并用ajax异步提交上传;

前端代码:

        <div class="txtItemdiv">
            菜品图片:
        </div>
        <div class="txtItemdiv" id="localImag">
                <img id="dishImage" class="imgDish" src="/HotelWebMvc/Images/dish/174.png" />
        </div>
        <div class="txtItemdiv">
            <input type="file" name="fulImage" id="fulImage" onchange="onChange(this);" style="border: 1px solid #FFB70B; " />
        </div>
<script type="text/javascript">
    //判断是否IE
    function _isIE() {
        if (!!window.ActiveXObject || "ActiveXObject" in window)
            return true;
        else
            return false;
    }

    //校验文件大小
    function checkfilesize(fileObj) {
        var isIE = _isIE();
        var isIE6 = isIE && !window.XMLHttpRequest; //IE6及以下
        var filesize = -1;

        var maxsize = 2 * 1024 * 1024;
        var errMsg = "上传的文件不能超过2M!"
        var tipMsg = "您的浏览器暂不支持计算上传文件的大小,确保上传文件不要2M,建议使用IE、FireFox、Chrome浏览器!"
        var result = "";

        if (isIE6) {
            var img = new Image();
            img.dynsrc = fileObj.value;
            filesize = img.fileSize;
        } else if (fileObj.files && fileObj.files[0]) {
            filesize = fileObj.files[0].size;
        } else {
            fileObj.select();
            fileObj.blur();
            var imgSrc = document.selection.createRange().text;
            var fso = new ActiveXObject("Scripting.FileSystemObject");
            filesize = fso.GetFile(imgSrc).size;
        }

        if (filesize == -1) {
            result = tipMsg;
        } else if (filesize > maxsize) {
            result = errMsg;
        }

        return result;
    }

    //校验文件名
    function checkfilename(fileObj) {
        var errMsg = "图片仅支持jpg和png格式!";
        var result = "";

        var filename = fileObj.value;
        var extname = filename.substring(filename.lastIndexOf('.'), filename.length).toLowerCase();
        if (extname != ".jpg" && extname != ".png") {
            result = errMsg;
        }

        return result;
    }

    //下面用于图片上传预览功能
    function setImagePreview() {
        var isIE = _isIE();
        var isIE6 = isIE && !window.XMLHttpRequest; //IE6及以下

        var docObj = document.getElementById("fulImage");
        var imgObjPreview = document.getElementById("dishImage");
        //files属性:返回一个 Files 集合,由指定文件夹中包含的所有 File 对象组成,包括设置了隐藏和系统文件属性的文件。
        if (isIE6) {
            imgObjPreview.src = docObj.value;
        } else
            if (docObj.files && docObj.files[0]) {
                //火狐下,直接设img属性
                //imgObjPreview.style.display = 'block';
                //imgObjPreview.style.width = '150px';
                //imgObjPreview.style.height = '180px';
                //imgObjPreview.src = docObj.files[0].getAsDataURL();

                //火狐7以上版本不能用上面的getAsDataURL()方式获取,需要以下方式

                imgObjPreview.src = window.URL.createObjectURL(docObj.files[0]);
            } else {
                //IE下,使用滤镜
                //焦点转移到图片选择按钮
                docObj.select();
                var imgSrc = document.selection.createRange().text;
                var localImagId = document.getElementById("localImag");
                //必须设置初始大小
                localImagId.style.width = "250px";
                localImagId.style.height = "280px";
                //图片异常的捕捉,防止用户修改后缀来伪造图片
                try {
                    localImagId.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
                    localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;
                }
                catch (e) {
                    alert("您上传的图片格式不正确,请重新选择!" + e.message);
                    return false;
                }
                imgObjPreview.style.display = 'none';
                document.selection.empty();
            }
        return true;
    }

    //图片选中后检查
    function onChange(fileObj) {
        //文件大小限制
        var filesizeErr = checkfilesize(fileObj);
        if (filesizeErr.length != 0) {
            fileObj.value = null;
            alert(filesizeErr);
            return;
        }
        //文件类型限制
        var filenameErr = checkfilename(fileObj);
        if (filenameErr.length != 0) {
            fileObj.value = null;
            alert(filenameErr);
            return;
        }

        //图片预览
        setImagePreview();
    }

    //异步提交
    function ajaxSubmit() {
        //提交地址
        var url = "@ViewBag.url";
        //菜品id
        var DishId = '@Model.DishId';
        // 数据提交
        $.ajax({
            type: "POST", //设置请求发送的方式
            timeout: 10000, //设置服务器请求超时时间
            url: url, //提交的地址
            data: $("#myform").serialize(), //序列化表单元素值
            beforeSend: function () {//表单提交前执行的函数
                //提示信息,此处省略...
            },
            error: function () {//提交发生错误的时候执行的函数
                //提示信息,此处省略...
            },
            success: function (data) {//提交成功的时候执行的函数
                data = JSON.parse(data);
                if (data >= "1") {
                    //上传图片
                    UploadFile(data);
                } else {
                    //提示信息,此处省略...
                }
            }
        });
    }

    //上传文件方法
    function UploadFile(data) {
        var fileObj = document.getElementById("fulImage").files[0]; // js 获取文件对象
        if (fileObj == undefined) {//是否有文件
            //提示信息,此处省略...
            return;
        }
        var url = "SaveImage"; // 接收上传文件的后台地址

        var form = new FormData(); // FormData 对象
        form.append("file", fileObj); // 文件对象
        form.append("DishId", data.DishId);

        xhr = null;  // XMLHttpRequest 对象
        if (window.XMLHttpRequest) {// code for IE7, Firefox, Mozilla, etc.
            xhr = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {// code for IE5, IE6
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }

        xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
        xhr.onload = uploadComplete; //请求完成
        xhr.onerror = uploadFailed; //请求失败
        xhr.send(form); //开始上传,发送form数据
    }

    //上传成功响应
    function uploadComplete(evt) {
        //服务端接收完文件返回内容
        var rText = evt.target.responseText;
        //提示信息,此处省略...

        //页面跳转,2019-01-10
        var DishId = '@Model.DishId';
        if (DishId == 0) {
            location.reload();
        } else {
            history.go(-1);
            location.reload();
        }
    }
    //上传失败
    function uploadFailed(evt) {
        alert("图片上传失败!");
    }
    //取消上传
    function cancleUploadFile() {
        xhr.abort();
    }

    //让页面的图片不从缓存中去取,2019-01-16
    function noImageCache() {
        var dishImage = document.getElementById('dishImage');
        dishImage.src = dishImage.src + '?' + Math.random();
    };
    addLoadEvent(noImageCache);
</script>

后端代码:

    [Authorize]
    public class DishesController : Controller
    {
        //保存上传图片
        public ActionResult SaveImage(HttpPostedFileBase file)
        {
            //获取用户提交的参数
            string DishId = Request.Form["DishId"];
            //是否有文件
            if (file == null)
                return Content("图片没有上传!");
            //文件大小限制
            double fileLength = file.ContentLength / (1024.0 * 1024.0);
            if (fileLength > 2.0)
            {
                return Content("图片不能超过2M!");
            }
            //文件类型限制
            string ext = file.FileName.Substring(file.FileName.LastIndexOf("."));
            string fileName = "";
            if (ext == ".jpg" || ext == ".png")
            {
                fileName = DishId + ".PNG";
            }
            else
            {
                return Content("图片仅支持JPG、png格式!");
            }
            //获取文件保存路径
            string serverPath = Server.MapPath("~/Images/dish");
            //执行保存文件
            try
            {
                string path = serverPath + "\\" + fileName;
                file.SaveAs(path);
                return Content("上传图片成功!");
            }
            catch (Exception ex)
            {
                return Content("上传图片失败!" + ex.Message );
            }
        }
    }

 

posted @ 2019-11-20 16:22  老余的水壶  阅读(209)  评论(0)    收藏  举报