js 预处理用户上传图片

前几个月闲得无聊写得一段代码,没想最近刚好用上了,在硬盘里翻了半天找回来,还没好好整理直接用上了
图片会处理成PNG,比jpg 大很多,最好判断一下用户上传的图片size 大到一定程度再决定是否使用该方法
最长边800*600像素的PNG一般在1M左右
大的 jpg 转换成尺寸小一点的图片可以一用,比如用户拍照上传的图片一般都在1M 到4M 之间,如果只是用作头像尺寸就可以缩小很多,1M甚至几M的图转换成几百K。

<!doctype html>
<html>
<head>
<title>test</title>
<script src="js/zepto-master/src/zepto.min.js"></script>
<script>

/*****

by cnblogs.com/ecalf

**/

var uploadImg = (function($){

    function fileUpLoader(config){
        if(typeof(config.field)==‘string‘){//input type=file
            config.field = document.getElementById(config.field);
        }
        if(typeof(config.viewPane)==‘string‘){//预览图
            config.viewPane = document.getElementById(config.viewPane);
        }
        if(typeof(config.uploadBtn)==‘string‘){//上传按钮
            config.uploadBtn = document.getElementById(config.uploadBtn);
        }

        this.afterSelectFile = config.afterSelectFile||function(){};

        this.maxSize = config.maxSize==undefined?4194304:(config.maxSize||0);//maxSize 0 不限制大小 

        this.field = config.field;
        this.viewPane = config.viewPane;
        this.uploadBtn = config.uploadBtn;
        if(config.uploadUrl){
            this.uploadUrl = config.uploadUrl;
        }
        if(typeof(config.afterUpload)==‘function‘){
            this.afterUpload = config.afterUpload;
        }
        if(Object(config.extParams)===config.extParams){
            this.extParams = config.extParams;
        }

        this.init();
    }
    fileUpLoader.prototype = {
        init:function(){
            this.domEvents();
            console.log(‘uploadfile init‘);
        },
        domEvents:function(){
            var host = this;

            if(host.field&&host.afterSelectFile){
                $(host.field).on("change",function(e){
                    host.afterSelectFile&&host.afterSelectFile(this);
                });
            }

            if(host.uploadBtn){
                $(host.uploadBtn).on(‘click‘,function(){
                    host.upload();
                });
            }

        },

        imgToDataURL:function(img,callback,frag){
            var databack={
                    status:true,
                    dataURL:‘‘,
                    callback:callback,
                    resolve:function(){
                        this.callback(this.dataURL);
                    }
                }

            var trans = function(pic){//canvas.toDataURL,context.getImageData 不能读取跨域图片
                pic.crossOrigin = "*";
                var cvs = document.createElement("canvas");
                document.body.appendChild(cvs);
                var ctx = cvs.getContext(‘2d‘);
                cvs.width = pic.width;
                cvs.height = pic.height;

                console.log(‘img size:‘,pic.width+‘px‘,pic.height+‘px‘);
                ctx.drawImage(pic,0,0,pic.width,pic.height);
                var dataURL = cvs.toDataURL();
                console.log(‘dataURL length:‘,dataURL.length)
                cvs = null;
                ctx = null;

                return dataURL;
            };

            if(!frag&&img.width&&img.height){ //img 加载完才能取出img的数据,如果在domReady 里面执行,图片未加载完会绘制出空白的 canvas
                console.log(‘trans directly‘);
                databack.dataURL = trans(img);
                databack.resolve();

            }else{//使用 图片的 natural size,img loaded后才能获得高宽
                databack.status = false;
                var pic = new Image();
                pic.crossOrigin = "*";
                pic.onload = function(e){
                    console.log(‘trans onload‘);
                    databack.dataURL = trans(e.target);
                    databack.status = true;
                    databack.resolve();
                    pic = null;
                };
                pic.src = img.src;
            }

            return databack;
        },

        dataURLToBlob:function(dataURL){
            console.log(dataURL.length)
            var type = dataURL.match(/data:(.+?);/);
            type = type?type[1]:‘image/png‘;
            var dataContent = dataURL.replace(/^.+,/,‘‘);
            dataContent = atob(dataContent);
            var dataCharCode = [];
            var i = 0;
            while(i<dataContent.length){
                dataCharCode[i] = dataContent.charCodeAt(i);
                i++;
            }
            var u8Arr = new Uint8Array(dataCharCode);
            return  new Blob([u8Arr],{type:type}); // you maybe use new BolbBuilder() in older browser

        },

        readURL:function (input,callback) {//创建预览图
            input = input||this.field;
            if (input.files && input.files[0]) {
                if(this.maxSize&&input.files[0].size > this.maxSize){
                    alert(‘文件大于‘+(this.maxSize/(1024*1024))+‘m,请重新上传‘);
                    return false;
                }

                var reader = new FileReader();
                reader.onload = function (e) {
                    callback&&callback(e.target.result);
                };
                var dataUrl = reader.readAsDataURL(input.files[0]);
                reader = null;
                return dataUrl;
            }
        },

    upload:function(fileConfig){
        var host = this;
        var formData = new FormData();
        var file,name,filename;
        if(!fileConfig){
            name = host.field.name;
             file = host.field.files[0];
             filename = host.field.value.split(/[/\\]/).pop()||"temp.png";
        }else{
            name = fileConfig.name;
             file = fileConfig.file;
             filename = fileConfig.filename||"temp.png";
        }

        if(!file){
            console.log(‘no file‘);
        }

        formData.append(name,file,filename);

        if(Object(host.extParams)===host.extParams){
            $.each(host.extParams,function(k,v){
                formData.append(k,v);
            });
        }

        $.ajax({
                url: host.uploadUrl,
                type: ‘POST‘,
                data: formData,
                async: true,
                dataType:‘json‘,
                cache: false,
                contentType: false,
                processData: false,
                timeout:45000,
                success: function (data,status, xhr) {
                    host.afterUpload&&host.afterUpload(data);

                },
                error:function(xhr, errorType, error){
                    console.log(errorType, error);
                },
                complete:function(xhr, status){
                    console.log(‘post complete,status:‘,status);
                }
            });

        }//end upload
    };

    return {
        init:function(config){
            return new fileUpLoader(config);
        }
    };

})(Zepto);

$(document).ready(function(){
    upload = uploadImg.init({
        field:‘uploadimg‘,
        viewPane:‘viewPane‘,
        uploadBtn:‘submitbtn‘,
        uploadUrl:‘yourimguploadurl.jsp‘,
        maxSize:0,
        afterUpload:function(resp){ },
        extParams:{uid:12}
    });

    window.onload = function(){
        var img = document.querySelector("img");
        upload.imgToDataURL(img,function(DataURL){
            var blob = upload.dataURLToBlob(DataURL);
            console.log(blob);
        },true);
    };

    $("#uploadimg").on("change",function(){
        var file = this.files[0];
        if(!file){ return; }

        upload.readURL(this,function(dataURL){
            upload.viewPane&&(upload.viewPane.src = dataURL);
            var img = new Image();
            img.onload = function(){
                var img = document.querySelector("img");
                upload.imgToDataURL(img,function(dataURL){
                    var blob = upload.dataURLToBlob(dataURL);
                    console.log(blob);
                },false);
            }
            img.src=dataURL;

        });
    });

});

</script>
</head>
<body>
<div>
<img id="viewPane" width="800" height="600"  src="img/1111.png" />
<form id="testform">
<!-- camera--照相机;camcorder--摄像机;microphone--录音 -->
<input id="uploadimg" type="file" accept="image/*" capture="camera" />
<input id="submitbtn" type="submit" />
</form>

</div>
</body>
</html>
时间: 2024-10-06 18:07:41

js 预处理用户上传图片的相关文章

java web应用用户上传图片的存储地址

原来工程的上传图片存储地址在web应用的目录下,并且是硬编码到其中的: 每次使用maven tomcat:redeploy以后,这个目录就没有了. 现在想要把上传图片的位置移动到tomcat的webapps目录中专门存放图片的一个目录下. 即,新建的一个images目录用来存放web应用的图片们. 这样就把工程和用户上传图片分离了,以后在redeploy时也不用预先备upload目录,然后再拷贝回去,因而在web应该更新时比较方便些.此外,还想改变文件路径被硬编码到java文件中的现状,所以将文

JS预处理机制

IE中界面加载顺序为从上往下加载..同步加载..如 一个界面 70多个请求的情况下. 导致页面加载及其慢. JS预处理机制: 大概原理: 用XMLHTTP取得脚本的内容,再创建Script对象,另外注意编码保持一致,因为服务器和XML使用UTF8的编码传送数据.类似于预报加载这些js脚本文件.界面上尽量不要出现没有必要引用的js文件,减缓页面加载速度不说,还容易出现js错误.      实现方式: 1-3种方法是异步的,基本上都在一个主界面(需优化的界面上采取,动态写,改,生成一个script脚

Vue.Js的用户体验优化

一次基于Vue.Js的用户体验优化 一.写在前面 半年以前,第一次在项目上实践VueJs,由于在那之前,没有Angular,avalon等框架的实践经验,所以在Vue的使用上,没有给自己总结出更多的经验和体验.随着项目进行和优化改版,无论是新代码的增加还是旧代码,在功能的实现和代码的书写上,Vue逐渐替代了Jquery,除了有些不容易替换和没有找到基于vue更合适的组件.Vue的使用,在我个人的感受中减轻了我操作dom的负担,我不需要从dom中获取数据,然后拼装数据,也不需要向dom中回写展示数

js记录用户在网站的浏览记录和停留时间(2)

问题:上次的代码确实解决了一部分用户访问记录的收集,但是还是存在一个问题就是 我们网站的注册 都是新页面打开的,如果用户刚进入网站就点击注册(打开了新的页面) ,我代码里用到的 onbeforeunload 就无法将用户进入的页面存储到本地了,也就是导致 访问了网站 直接点击注册的用户 无法被记录.所以这次对数据的记录方式做了拆分. 这个是上一次文章的链接:http://weber.pub/js记录用户行为浏览记录和停留时间/163.html 思路 当用户进入网站,页面加载完成的时候执行 win

js判断用户是否正在滚动滚动条,滚动条滚动是否停止

js智能判断是否可以自动滚动 比如,做一个音乐播放器,边播放,边定位歌词,播放的时候,需要自动定位到播放语句,但是用户去拖动或者滚动div(歌词面板)时,这时就必须停止自动滚动,或者说是不能自动滚动,这个怎么做呢? 如果能时时判断 用户是否在滚动就好了? 或者能够 知道滚动开始 和 结束事件 也行? 可惜均不知道! 目前,仅可以利用的就是div元素的滚动事件,下面是我的实现思路,如何判断用户是否滚动停止? 1.html代码 <div id="panel"> <div

一次基于Vue.Js的用户体验优化

.mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑体", Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 15px 0 !important; padding: 5px 0 5px 20px; width: 97% } .arti

js无刷新上传图片,服务端有生成缩略图,剪切图片,iphone图片旋转判断功能

html: <form action="<{:AppLink('circle/uploadimg')}>" id="imageform" method="post" enctype="multipart/form-data">     <input name="photoimg" type="file" id="xwzx_f" style

js php xmlrequest 上传图片

本来想用插件上传图片的,后来自己写了一个简单的js实现异步的图片上传,不多说上代码很easy upload.php <?php if(isset($_FILES["myfile"])) { $ret = array(); $uploadDir = 'images'.DIRECTORY_SEPARATOR.date("Ymd").DIRECTORY_SEPARATOR; $dir = dirname(__FILE__).DIRECTORY_SEPARATOR.$

js页面用户信息填写表单

在网页中我们会经常看见各色的用户信息填写表单,其中会包括各种输入框.按钮.单复选框和下拉式菜单,今天的我们就以最简单的为例做一个简易版的用户信息填写表单(此处使用html文本),仅供初学者参考,也请各位前辈多多指教! 在这个范例当中,我们将对用户输入的信息做简易验证.主要判读那用户名.密码.确认密码不能为空,密码和确认密码要保持一致. 注意点: 1.用户信息的填写如果是在一张form表单中,则只能出现一个submit按钮提交,这种情况比较简易,只需要在body模块<form>中添加onSubm