美文网首页
图片压缩后上传(压缩工作在前端完成)

图片压缩后上传(压缩工作在前端完成)

作者: CJL181 | 来源:发表于2020-08-13 16:36 被阅读0次

本文只是经# 图片纯前端JS压缩的实现核心代码的简单修改后的多图片上传版本;

HTML

<div id="effect" class="part">
    <h3>效果(400x400限制):</h3>
    <div class="show">
        <div class="demo">
            <p><input id="file1" type="file" multiple="true" accept="image/gif, image/png, image/jpg, image/jpeg"></p>
            <p id="log"></p>
        </div>

        <button id="upd" type="button" class="btn btn-secondary" >文件上传</button>
    </div>
</div>

JS变量及辅助函数

    var eleFile = document.querySelector('#file1');

    // 压缩图片需要的一些元素和对象
    var reader = new FileReader(), img = new Image();
    // 缩放图片需要的canvas
    var canvas = document.createElement('canvas');
    var context = canvas.getContext('2d');

    var mul_file = new Array();
    var file_size = 0;
    var blobs = new Array();
    var time = 0;
    var time_unit = 30;

    function isInArray2(arr,value){
        var index = $.inArray(value,arr);
        if(index >= 0){
            return true;
        }
        return false;
    }

    eleFile.addEventListener('change', function (event) {
        mul_file = [];
        blobs = [];
        for (var i=0;i<event.target.files.length;i++)
        {
            mul_file.push(event.target.files[i]);
        }

        file_size = mul_file.length;
        time = file_size * time_unit;
        console.log("**file_size:"+file_size);

        if (mul_file) {
            [].forEach.call(mul_file, readAndPreview);
        }
    });

JS核心

      function readAndPreview(file) {
        // 确保 `file.name` 符合我们要求的扩展名
        if (file.type.indexOf("image") == 0) {
            var reader = new FileReader();
            var image = new Image();

            reader.onload = function(e) {
                image.src = e.target.result;
            };

            reader.readAsDataURL(file);

            image.onload = function(){
                // 图片原始尺寸
                var originWidth = this.width;
                var originHeight = this.height;
                // 最大尺寸限制
                var maxWidth = 400, maxHeight = 400;
                // 目标尺寸
                var targetWidth = originWidth, targetHeight = originHeight;
                // 图片尺寸超过400x400的限制
                if (originWidth > maxWidth || originHeight > maxHeight) {
                    if (originWidth / originHeight > maxWidth / maxHeight) {
                        // 更宽,按照宽度限定尺寸
                        targetWidth = maxWidth;
                        targetHeight = Math.round(maxWidth * (originHeight / originWidth));
                    } else {
                        targetHeight = maxHeight;
                        targetWidth = Math.round(maxHeight * (originWidth / originHeight));
                    }
                }

                // canvas对图片进行缩放
                canvas.width = targetWidth;
                canvas.height = targetHeight;
                // 清除画布
                context.clearRect(0, 0, targetWidth, targetHeight);
                // 图片压缩
                context.drawImage(image, 0, 0, targetWidth, targetHeight);
                // canvas转为blob并上传
                canvas.toBlob(function (blob) {
                    if(!isInArray2(blobs,blob)){
                        blob.name = file.name;
                        blobs.push(blob);
                        console.log(blob);
                    }
                }, file.type || 'image/png');

                file_size--;
                if(file_size === 0){
                    setTimeout(() => {
                        for(var j=0;j<blobs.length;j++){
                            var blob = blobs[j];
                            var img = document.createElement("img");
                            img.onload = function(e) {
                                window.URL.revokeObjectURL(img.src); // 清除释放
                            };
                            img.src = window.URL.createObjectURL(blob);
                            document.body.appendChild(img);
                        }
                    },time);
                }
            }
        }
    }

文件对象封装及上传触发

$('#upd').click(function (e) {
        var formData = new FormData();
        for(var i = 0;i<blobs.length;i++){
            formData.append("file",blobs[i],blobs[i].name);
        }

        $.ajax({
            url: "/uploadImg1",
            data:formData,
            type:'post',
            contentType:false,
            processData:false,
            success:function(data) {
                alert("Data Loaded: " + data);
            }
        });
    })

后端数据接收解析及保存

    @RequestMapping("/uploadImg1")
    @ResponseBody
    public String upload1(@RequestParam("file") MultipartFile[] files,Model model)  {
        if (files.length < 1) {
            return "上传失败,请选择文件";
        }
        for (int i = 0; i < files.length; i++) {
            MultipartFile file = files[i];
            String fileName = file.getOriginalFilename();
            File dest = null;
            String os = System.getProperty("os.name");
            if (os.toLowerCase().startsWith("win")) {
                String path = "d:"+File.separator+"img"+File.separator;
                dest= new File(path + fileName);
            }else {
                String path = "/webapps/img/";
                dest= new File(path + fileName);
            }
            try {
                file.transferTo(dest);
            } catch (IOException e) {
                return JSON.toJSONString("上传失败!");
            }
        }
        return JSON.toJSONString("上传成功!");
    }

相关文章

  • 图片压缩后上传(压缩工作在前端完成)

    本文只是经# 图片纯前端JS压缩的实现核心代码的简单修改后的多图片上传版本; HTML JS变量及辅助函数 JS核...

  • 图片压缩上传

    参考1-HTML5实现图片压缩上传功能参考2-移动前端—图片压缩上传实践参考3-移动端H5图片压缩上传 大体步骤 ...

  • iPic for Mac(图床神器) v1.7.0中文免费版

    上传图片相关设置 上传前压缩图片 可以在 iPic 的 偏好设置 中开启「上传前压缩图片」选项,目前支持压缩的图片...

  • 2020-05-23 前端图片压缩

    前端完成图片压缩 流程 通过原生的input标签拿到要上传的图片文件 将图片文件转化成img元素标签 在canva...

  • HTML5 file API加canvas实现图片前端JS压缩并

    一、图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验...

  • 一次基于electron的图片上传插件的开发过程

    背景: 项目前端有个图片压缩包上传功能,用户上传的时候会选择单反拍摄的巨幅图片,由于前端打不开压缩包,也没法读取压...

  • 前端图片压缩上传

    最近公司有个需求,就是上传照片时需要先压缩。其中上传原理是用ajax上传formdata数据,压缩是采用canva...

  • 前端图片压缩上传

    (纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需...

  • iOS 网络上传图片

    上传图片 构造参数(NSArray *)files 上传图片—压缩 压缩到小于(...

  • h5上传图片压缩

    涉及知识点 uniapp项目h5,涉及到前端图片压缩上传 uni.chooseImage() canvas压缩 参...

网友评论

      本文标题:图片压缩后上传(压缩工作在前端完成)

      本文链接:https://www.haomeiwen.com/subject/nyfidktx.html