H5实现多图上传与预览,图片压缩上传

 H5多图上传,并实现压缩(可根据实际情况选择对多大的图片进行压缩,本例为大于512KB的进行压缩)和预览

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>H5多图压缩上传与预览</title>
    <style type="text/css">
    .container {
        margin: 30px auto;
        max-width: 1100px;
    }

    .btn {
        position: relative;
        display: inline-block;
        padding: 6px 12px;
        font-size: 14px;
        line-height: 1.42857143;
        text-align: center;
        vertical-align: middle;
        font-weight: 400;
        color: #fff;
        background-color: #627aad;
        border: 1px solid #627aad;
        border-radius: 3px;
        cursor: pointer;
    }

    .btn-danger {
        background-color: #de815c;
        border-color: #de815c;
    }

    .btn-info {
        background-color: #5cafde;
        border-color: #5cafde
    }

    .file-input {
        position: absolute;
        left: -99999px
    }

    .image-wrap {
        overflow: hidden;
        min-height: 120px;
        margin-top: 15px;
        margin-bottom: 15px;
    }

    .image-preview {
        float: left;
        width: 120px;
        height: 120px;
        margin-right: 10px;
        text-align: center;
        cursor: pointer;
    }

    .image-preview img {
        height: 100%;
        width: 100%;
    }

    .big-image {
        margin-top: 15px;
    }
    </style>
</head>

<body>
    <div class="container">
        <label class="btn" for="fileInput">
            多图上传
            <input id="fileInput" class="file-input" type="file" multiple="multiple" accept="image/jpeg,image/jpg,image/png">
        </label>
        <span class="btn btn-danger" id="delImage">删除</span>
        <div id="imageWrap" class="image-wrap">
        </div>
        <span class="btn btn-info" id="submitImage">上传</span>
        <div class="big-image">
            <img src="" alt="" id="bigImage">
        </div>
    </div>
    <script>
    // 兼容IE10+
    (function imgUp() {
        var fileInput = document.getElementById('fileInput'),
            imageWrap = document.getElementById('imageWrap'),
            delImage = document.getElementById('delImage'),
            bigImage = document.getElementById('bigImage'),
            submitImage = document.getElementById('submitImage'),
            photoCompress, submitPicture;
        // 对图片进行压缩 
        photoCompress = function(fileObjAll, wrap, index) {

            var ready = new FileReader(),
                fileObj = fileObjAll[index],
                size = fileObj.size / 1024;
            quality = 1; // quality值越小,所绘制出的图像越模糊
            // 512是512KB,大于512对图片进行压缩,可根据实际情况修改大小(压缩并不精确,大概是这个范围)
            quality = size > 512 ? quality = 512 / size : quality; //进行压缩上传  

            /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,
            如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
            ready.readAsDataURL(fileObj);
            ready.onload = function() {
                var img = new Image();
                img.src = this.result;
                img.onload = function() {
                    var that = this,
                        // 默认按比例压缩
                        w = that.width,
                        h = that.height;
                    //生成canvas
                    var canvas = document.createElement('canvas'),
                        ctx = canvas.getContext('2d');

                    canvas.setAttribute('width', w);
                    canvas.setAttribute('height', h);
                    ctx.drawImage(that, 0, 0, w, h);

                    var base64 = canvas.toDataURL(fileObj.type, quality),
                        div = document.createElement('div'),
                        img = document.createElement('img');
                    div.classList.add('image-preview');
                    img.setAttribute('src', base64);
                    img.setAttribute('data-name', fileObj.name);
                    div.appendChild(img);
                    wrap.appendChild(div);

                    index++;
                    if (fileObjAll.length > index) {
                        // 一个接着一个显示的效果
                        setTimeout(function() {
                            photoCompress(fileObjAll, wrap, index);
                        }, 100);
                    }
                };
            };
        };
        // 上传图片
        submitPicture = function() {
            var formData = new FormData(),
                convertBase64UrlToBlob;

            convertBase64UrlToBlob = function(urlData) {
                var arr = urlData.split(','),
                    mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]),
                    n = bstr.length,
                    u8arr = new Uint8Array(n);
                while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                }
                return new Blob([u8arr], { type: mime });
            };
            Array.prototype.slice.call(imageWrap.getElementsByTagName('img'))
            .forEach(function(v, i) {
                var imgBlob = convertBase64UrlToBlob(v.getAttribute('src'))
                formData.append(v.getAttribute('data-name'), imgBlob);
            })

            var xhr = new XMLHttpRequest();

            // url更换为真实地址
            xhr.open('POST', 'url', true);

            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    console.log(JSON.parse(xhr.responseText));
                } else {
                    console.log(xhr.statusText);
                }
            }
            xhr.send(formData);

            /*ajax发送
        	
    		$.ajax({
			    type: 'POST',
				url: 'url',
				data: formData,
				cache: false,
				processData: false, // 不处理数据
				contentType: false, // 不设置内容类型
				success: function(msg) {
					console.log(msg)
				}
			});
        	*/
        };

        // 预览图片
        fileInput.addEventListener('change', function(e) {
            photoCompress(this.files, imageWrap, 0);
        }, false)

        // 删除图片
        delImage.addEventListener('click', function(e) {
            fileInput.value = '';
            imageWrap.innerHTML = '';
        }, false)

        // 预览大图
        imageWrap.addEventListener('click', function(e) {
            var e = e.target,
                tagName = e.tagName.toLowerCase();
            if (tagName === 'div') return;
            while (tagName !== 'img') {
                e = e.parentNode;
            }
            bigImage.setAttribute('src', e.getAttribute('src'))
        }, false)

        // 上传图片
        submitImage.addEventListener('click', function(e) {
            submitPicture();
        }, false)
    }())
    </script>
</body>

</html>

效果:

 

预览大图:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值