上传图片

 

在常见的用户注册页面,需要用户在本地选择一张图片作为头像,并同时预览。

常见的思路有两种:一是将图片上传至服务器的临时文件夹中,并返回该图片的url,然后渲染在html页面;另一种思路是,直接在本地内存中预览图片,用户确认提交后再上传至服务器保存。

这两种方法各有利弊,方法一很明显,浪费流量和服务器资源;方法二则加重了浏览器的负担,并且对浏览器的兼容性要求更高(在某些低版本中的IE浏览器不支持)。

 eg1:window.FileReader本地预览

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>图片上传预览演示</title>
    <style>
        .img-padd{margin-top:10px;padding-bottom:10px;border:1px #e3e3e3 solid}
        .img-padd h1{font-size:32px;text-align:center;color:#3a3a3a;margin:30px 30px}
        .img-box{position:relative;margin:0 auto;width:300px;height:300px;border:1px #e3e3e3 solid;display:table;border-radius:6px}
        .img-box h1{text-align:center}
        .img-box .img-box-div{display:table-cell;vertical-align:middle}
        .img-box .img-box-div img{width:100%}
        .img-box .input-file{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}

    </style>
</head>
<body>
<div class="img-padd">
    <h1> window.FileReader本地预览</h1>
    <div class="img-box">
        <input type="file" class="input-file img-btn">
        <div class="img-box-div img-container" >
            <img src="images/upload.png" alt="">
        </div>
    </div>
</div>

<script>
//上传图片并预览
    function previewImg(fileInput, imgDiv) {
        if (window.FileReader) {//支持FileReader的时候
            var reader = new FileReader();
            reader.readAsDataURL(fileInput.files[0]);
            reader.onload = function (evt) {
                imgDiv.innerHTML = "\<img src=" + evt.target.result + "\>";
            }
        } else {//兼容ie9-
            imgDiv.innerHTML = '<div class="img" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src=\'' + fileInput.value + '\)\';"></div>';
        }
    }

    function selectImg(fileInputs, imgDivs) {
        var checkImg = new RegExp("(.jpg$)|(.png$)|(.bmp$)|(.jpeg$)", "i");
        var i = 0;
        for (; i < fileInputs.length && i < imgDivs.length; i++) {
            (function (i) {//立即执行函数;保存i
                fileInputs[i].onchange = function () {
                    if (checkImg.test(fileInputs[i].value)) {
                        previewImg(this, imgDivs[i]);
                    } else {
                        alert("只支持上传.jpg .png .bmp .jpeg;你的选择有误");
                    }
                };
            })(i);
        }

    }

    /* 为IE6 IE7 IE8增加document.getElementsByClassName函数 */
    /MSIE\s*(\d+)/i.test(navigator.userAgent);
    var isIE = parseInt(RegExp.$1 ? RegExp.$1 : 0);
    if (isIE > 0 && isIE < 9) {
        document.getElementsByClassName = function (cls) {
            var els = this.getElementsByTagName('*');
            var ell = els.length;
            var elements = [];
            for (var n = 0; n < ell; n++) {
                var oCls = els[n].className || '';
                if (oCls.indexOf(cls) < 0) continue;
                oCls = oCls.split(/\s+/);
                var oCll = oCls.length;
                for (var j = 0; j < oCll; j++) {
                    if (cls == oCls[j]) {
                        elements.push(els[n]);
                        break;
                    }
                }
            }
            return elements;
        }
    }

    var fileInputs = document.getElementsByClassName("img-btn");//文件选择按钮
    var imgDivs = document.getElementsByClassName("img-container");//图片容器
    selectImg(fileInputs, imgDivs);
</script>
</body>
</html>

 

eg2:window.URL.createObjectURL本地预览

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>图片上传预览演示</title>
    <style>
        .img-padd{margin-top:10px;padding-bottom:10px;border:1px #e3e3e3 solid}
        .img-padd h1{font-size:32px;text-align:center;color:#3a3a3a;margin:30px 30px}
        .img-box{position:relative;margin:0 auto;width:300px;height:300px;border:1px #e3e3e3 solid;display:table;border-radius:6px}
        .img-box h1{text-align:center}
        .img-box .img-box-div{display:table-cell;vertical-align:middle}
        .img-box .img-box-div img{width:100%}
        .img-box .input-file{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}

    </style>
</head>
<body>
<div class="img-padd">
    <h1> window.URL.createObjectURL本地预览</h1>
    <div class="img-box">
        <input type="file" class="input-file img-btn">
        <div class="img-box-div img-container">
            <img src="images/upload.png" alt="">
        </div>
    </div>
</div>

<script>
    //上传图片并预览
    function previewImg(fileInput, imgDiv) {
        //原书这里是event.files,经过测试,修正为this.files
        url = window.URL.createObjectURL(fileInput.files[0])    //创建URL对象
        if (url) {
            imgDiv.innerHTML = '<img src="' + url + '">';
        } else {
            imgShow.innerHTML = 'your browser doesnt support obj urls!'
        }
    }
    function selectImg(fileInputs, imgDivs) {
        var checkImg = new RegExp("(.jpg$)|(.png$)|(.bmp$)|(.jpeg$)", "i");
        var i = 0;
        for (; i < fileInputs.length && i < imgDivs.length; i++) {
            (function (i) {//立即执行函数;保存i
                fileInputs[i].onchange = function () {
                    if (checkImg.test(fileInputs[i].value)) {
                        previewImg(this, imgDivs[i]);
                    } else {
                        alert("只支持上传.jpg .png .bmp .jpeg;你的选择有误");
                    }
                };
            })(i);
        }

    }
    /* 为IE6 IE7 IE8增加document.getElementsByClassName函数 */
    /MSIE\s*(\d+)/i.test(navigator.userAgent);
    var isIE = parseInt(RegExp.$1 ? RegExp.$1 : 0);
    if (isIE > 0 && isIE < 9) {
        document.getElementsByClassName = function (cls) {
            var els = this.getElementsByTagName('*');
            var ell = els.length;
            var elements = [];
            for (var n = 0; n < ell; n++) {
                var oCls = els[n].className || '';
                if (oCls.indexOf(cls) < 0) continue;
                oCls = oCls.split(/\s+/);
                var oCll = oCls.length;
                for (var j = 0; j < oCll; j++) {
                    if (cls == oCls[j]) {
                        elements.push(els[n]);
                        break;
                    }
                }
            }
            return elements;
        }
    }

    var fileInputs = document.getElementsByClassName("img-btn");//文件选择按钮
    var imgDivs = document.getElementsByClassName("img-container");//图片容器
    selectImg(fileInputs, imgDivs);
</script>
</body>
</html>

 

 eg3:Ajax上传至后台并返回图片的url

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>图片上传预览演示-柯乐义</title>
    <style>
        .img-padd{margin-top:10px;padding-bottom:10px;border:1px #e3e3e3 solid}
        .img-padd h1{font-size:32px;text-align:center;color:#3a3a3a;margin:30px 30px}
        .img-box{position:relative;margin:0 auto;width:300px;height:300px;border:1px #e3e3e3 solid;display:table;border-radius:6px}
        .img-box h1{text-align:center}
        .img-box .img-box-div{display:table-cell;vertical-align:middle}
        .img-box .img-box-div img{width:100%}
        .img-box .input-file{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}

    </style>
</head>
<body>
<div class="img-padd">
    <h1> window.URL.createObjectURL本地预览</h1>
    <div class="img-box">
        <input type="file" class="input-file img-btn" id="avatar">
        <div class="img-box-div img-container">
            <img src="images/upload.png" alt="">
        </div>
    </div>
</div>
<script src="js/jquery.js"></script>
<script>
    //上传图片并预览
    function selectImg(fileInputs, imgDivs) {
        var checkImg = new RegExp("(.jpg$)|(.png$)|(.bmp$)|(.jpeg$)", "i");
        var i = 0;
        for (; i < fileInputs.length && i < imgDivs.length; i++) {
            (function (i) {//立即执行函数;保存i
                fileInputs[i].onchange = function () {
                    if (checkImg.test(fileInputs[i].value)) {
                        var formData={'avatar':$("#avatar")[0].files[0]};
                        console.log(formData);
                        $.ajax({
                            url: '/upload_avatar/',
                            type: 'POST',
                            data: formData,
                            contentType: false,
                            processData: false,
                            success: function (res) {
                                console.log(res);  /*服务器端的图片地址*/
                                imgDiv.innerHTML = '<img src="' + res + '">';/*预览图片*/
                                $("#avatar").val('/'+res);  /*将服务端的图片url赋值给form表单的隐藏input标签*/
                            }
                        })


                    } else {
                        alert("只支持上传.jpg .png .bmp .jpeg;你的选择有误");
                    }
                };
            })(i);
        }

    }
    /* 为IE6 IE7 IE8增加document.getElementsByClassName函数 */
    /MSIE\s*(\d+)/i.test(navigator.userAgent);
    var isIE = parseInt(RegExp.$1 ? RegExp.$1 : 0);
    if (isIE > 0 && isIE < 9) {
        document.getElementsByClassName = function (cls) {
            var els = this.getElementsByTagName('*');
            var ell = els.length;
            var elements = [];
            for (var n = 0; n < ell; n++) {
                var oCls = els[n].className || '';
                if (oCls.indexOf(cls) < 0) continue;
                oCls = oCls.split(/\s+/);
                var oCll = oCls.length;
                for (var j = 0; j < oCll; j++) {
                    if (cls == oCls[j]) {
                        elements.push(els[n]);
                        break;
                    }
                }
            }
            return elements;
        }
    }
    var fileInputs = document.getElementsByClassName("img-btn");//文件选择按钮
    var imgDivs = document.getElementsByClassName("img-container");//图片容器
    selectImg(fileInputs, imgDivs);
</script>
</body>
</html>

 

 

eg4:vue框架
<html lang="en" style="font-size: 42.6667px;">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-touch-fullscreen" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <meta name="msapplication-tap-highlight" content="no">
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,viewport-fit=cover;">
    <title>个人信息</title>
    <link rel="stylesheet" href="css/base.css">
    <link rel="stylesheet" href="css/mine.css">
    <link rel="stylesheet" href="css/login.css">
    <link rel="stylesheet" href="css/green.css">
    <link rel="stylesheet" href="css/branch.css">
    <link rel="stylesheet" href="css/order.css">
    <link rel="stylesheet" href="css/index.css">
    <link rel="stylesheet" href="css/mine.css">
    <style>
        .img-padd {
            margin-top: 1rem;
            padding-bottom: 1rem;
            border: 1px #e3e3e3 solid;
        }

        .img-padd h1 {
            font-size: .32rem;
            font-size: .36rem;
            text-align: center;
            color: #3a3a3a;
            margin: .2rem .3rem;
        }

        .img-box {
            position: relative;
            margin: 0 auto;
            width: 3rem;
            height: 3rem;
            border: 1px #e3e3e3 solid;
            display: table;
            border-radius: 6px
        }

        .img-box h1 {
            text-align: center;
        }

        .img-box .img-box-div {
            display: table-cell;
            vertical-align: middle
        }

        .img-box .img-box-div img {
            width: 100%
        }

        .img-box .input-file {
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            opacity: 0
        }
    </style>
    <script>
    </script>
</head>
<body>
<div id="barba-wrapper" class="hp100">
    <div class="barba-container hp100">
        <div class="common-head bg1 tc">
            <h3>上传图片</h3>
        </div>
        <div class="hp100 bgf8 common-content" id="uploadimages">
            <div class="img-padd">
                <h1> Ajax上传至后台并返回图片的url</h1>
                <div class="img-box">
                    <input type="file" class="input-file" id="fileinput" v-on:change="bindAvatar1">
                    <div class="img-box-div">
                        <img src="images/upload.png" id="imgsrc" alt="">
                    </div>
                </div>
            </div>

            <div class="img-padd">
                <h1> window.FileReader本地预览</h1>
                <div class="img-box">
                    <input type="file" class="input-file" v-on:change="selectImg(event)">
                    <div class="img-box-div">
                        <img src="images/upload.png" id="imgsrc2" alt="">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="js/require.min.js" data-main="js/common"></script>

<script>
    require(['jquery', 'vue'], function ($, Vue) {
        var uploadImages = new Vue({
                el: '#uploadimages',
                data: {
                },
                mounted: function () {
                },
                methods: {
                    bindAvatar1: function () {
                        var formData = {'avatar': $("#fileinput")[0].files[0]};
                        console.log(formData);
                        $.ajax({
                            url: '/upload_avatar/',
                            type: 'POST',
                            data: formData,
                            contentType: false,
                            processData: false,
                            success: function (res) {
                                console.log(res);
                                /*服务器端的图片地址*/
                                $("#imgsrc").src(res);
                                /*将服务端的图片url赋值给form表单的隐藏input标签*/
                            }
                        })
                    },
                    selectImg: function (event) {
                        var fileInput = event.target.files[0];
                        console.log(fileInput);
                        var checkImg = new RegExp("(.jpg$)|(.png$)|(.bmp$)|(.jpeg$)", "i");
                        if (checkImg.test(fileInput.name)) {
                            this.previewImg(fileInput);
                        } else {
                            alert("只支持上传.jpg .png .bmp .jpeg;你的选择有误");
                        }
                    },
                    previewImg: function (fileInput) {
                        var test = '';
                        if (window.FileReader) {//支持FileReader的时候
                            var reader = new FileReader();
                            reader.readAsDataURL(fileInput);
                            reader.onload = function (evt) {
                                $('#imgsrc2').attr('src',evt.target.result);
                            }
                        }
                    }
                }
            })
        ;
    });

</script>
</body>
</html>

 

转载于:https://www.cnblogs.com/theWayToAce/p/8145432.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值