1、upload.js

(function($) {
$.extend($.fn, {
images : new Array(),
initImages:function (images) {
$.each(images,function (index,value) {
$(this).images.push(value);
var $img = $('<div><div class="try-report-add thumb"><img class="dataImg" src='+ConstUtil.get("PIC_DOMAIN")+value+'></div>' +
'<img onclick="$(this).delImage(\''+value+'\',this)" src="/pages/prod/activity/try/images/try-delete.png"></div>');
$("#upImg").append($img);
})
},
getImages: function () {
return $(this).images;
},
delImage: function (url,e) {
for(i in $(this).images){
if(url == $(this).images[i]){
$(this).images.splice(i,1);
}
}
$(e).parent().remove();
$("#upload").show();
},
fileUpload: function(opts) {
this.each(function() {
var $self = $(this);
var quality = opts.quality ? opts.quality / 50 : 0.5;
var dom = {
"fileToUpload": $self.find(".fileToUpload"),
"thumb": $self.find(".thumb"),
"progress": $self.find(".upload-progress")
};
var funs = {
bindEvent: function() {
console.log(dom.fileToUpload)
// $self.click(function(){
// dom.fileToUpload.click(function (event) {
// event.stopPropagation();//防止事件冒泡
// }).click();
// });
dom.fileToUpload.on("change", function() {
if($(this).images.length>=opts.maxNum){
alert("最多只能上传"+opts.maxNum+"图片");
return;
}
funs.fileSelect(this);
});
},
fileSelect: function(obj) {
for(var i=0;i<obj.files.length;i++) {
var file = obj.files[i];
var reader = new FileReader();
reader.onload = function () {
var image = new Image();
image.src = reader.result;
image.onload = function () {
var wdh = Number(image.width)>Number(image.heihgt)? true : false;
var data = funs.compress(this);
funs.fileUpload(data, file.type,wdh);
};
};
reader.readAsDataURL(file);
}
},
fileUpload: function(data,type,wdh) {
if(type.indexOf('jpeg')>-1) type='image/jpg';
var text = window.atob(data.split(',')[1]);
var ia = new Uint8Array(text.length);
for (var i = 0; i < data.length; i++) {
ia[i] = text.charCodeAt(i);
}; var Builder = window.WebKitBlobBuilder || window.MozBlobBuilder;
var blob; if (Builder) {
var builder = new Builder();
builder.append(ia);
blob = builder.getBlob(type);
} else {
blob = new window.Blob([ia], {type: type});
}
var fd = new FormData();
fd.append(opts.file, blob);
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", opts.success, false);
xhr.addEventListener("error", opts.error, false);
xhr.open("POST", opts.url);
xhr.send(fd);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
var ret = JSON.parse(xhr.responseText);
console.log(ret);
console.log(ret.state);
if(ret.state=='SUCCESS'){
var commentListLiHeight = Number((window.screen.width)*0.92*0.3).toFixed(1);
if(wdh){
var $img = $('<li class="li-img"><a style="height: '+commentListLiHeight+'px;" href="javascript:;"><img class="dataImg" onclick="CommentDetail.initSwiper(this)" style="width: 100%;" src='+ret.url+'></a>' +
'<i class="icon-del" onclick="$(this).delImage(\''+ret.savepath+'\',this)"></i></li>');
}else{
var $img = $('<li class="li-img"><a style="height: '+commentListLiHeight+'px;" href="javascript:;"><img class="dataImg" onclick="CommentDetail.initSwiper(this)" style="height: 100%;" src='+ret.url+'></a>' +
'<i class="icon-del" onclick="$(this).delImage(\''+ret.savepath+'\',this)"></i></li>');
}
$("#upImg").prepend($img);
$(this).images.push(ret.savepath);
if($(this).images.length==opts.maxNum){
$("#upload").hide();
}
}
}
};
},
compress: function(img) {
var canvas = document.createElement("canvas"),
ctx = canvas.getContext('2d'),
tCanvas = document.createElement("canvas"),//瓦片canvas
tctx = tCanvas.getContext("2d");
var initSize = img.src.length;
var width = img.width;
var height = img.height; //如果图片大于四百万像素,计算压缩比并将大小压至400万以下
var ratio;
if ((ratio = width * height / 4000000)>1) {
ratio = Math.sqrt(ratio);
width /= ratio;
height /= ratio;
}else {
ratio = 1;
} canvas.width = width;
canvas.height = height; // 铺底色
ctx.fillStyle = "#fff";
ctx.fillRect(0, 0, canvas.width, canvas.height); //如果图片像素大于100万则使用瓦片绘制
var count;
if ((count = width * height / 1000000) > 1) {
count = ~~(Math.sqrt(count)+1); //计算要分成多少块瓦片 // 计算每块瓦片的宽和高
var nw = ~~(width / count);
var nh = ~~(height / count); tCanvas.width = nw;
tCanvas.height = nh; for (var i = 0; i < count; i++) {
for (var j = 0; j < count; j++) {
tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh); ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
}
}
} else {
ctx.drawImage(img, 0, 0, width, height);
} //进行最小压缩
console.log('*****',quality)
var ndata = canvas.toDataURL('image/jpeg', quality); console.log('压缩前:' + initSize);
console.log('压缩后:' + ndata.length);
console.log('压缩率:' + ~~(100 * (initSize - ndata.length) / initSize) + "%"); tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0; return ndata;
}
};
funs.bindEvent();
});
}
});
})($);

2、调用

var CommentDetail = {
bindEvent : function () {
var url ="/js/ueditor/jsp/uploader.jsp?action=uploaduser&dirName=comment&needCompress=true"; //上传路径
$("#upload").fileUpload({
"url": url,
"file": "comment",
"maxNum": 6
});
}

3、html

<div class="try-my-push clearfix">
<ul class="list" id="upImg">
<!--<iframe id="upframe" name="upframe" src="" style="display:none;"> </iframe>-->
<li class="try-report-btn" id="upload">
<a href="javascript:;">
<img src="data:images/input-file-default.png" alt="" width="100%;"style="max-width: 100%;"> <!--<form action="/plugins/ueditor/jsp/uploader.jsp?action=uploaduser&dirName=headimg&needCompress=true"-->
<!--method="POST" id="form1" enctype="multipart/form-data">-->
<input type="file" id="front-file" class="fileToUpload img-file">
</a>
<!--</form>-->
</li>
</ul>
</div>

可以实现单张图片压缩后上传,无法多张上传,通过for循环 多次异步请求,结果有可能返回同一个结果或者返回多个结果,但是是同一个图片。

h5 端图片上传的更多相关文章

  1. h5 端图片上传-模拟多张上传

    1.由于后端的限制,上传图片到服务器只能的一张一张传2.显示图片预览是本地的图片3.根据服务器返回的结果拿到相应的路径保存到提交评论的接口中4.删除的时候,需要删除对应的路径,不要把删除的提交到评论的 ...

  2. 移动端H5实现图片上传

    移动端H5实现图片上传 https://segmentfault.com/a/1190000010034177

  3. angularJS+Ionic移动端图片上传的解决办法

    前端开发中经常会碰到图片上传的问题,网上的解决办法很多,可是有些图片上传的插件会有一些附属的插件,因此因为一个图片上传的问题可能额需要引入其他插件到项目中,久而久之项目会不伦不类,有时候插件之间也会有 ...

  4. 移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

    现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片 ...

  5. vue+axios实现移动端图片上传

    在利用vue做一些H5页面时,或多或少会遇到有图片上传的操作,主要是运用html5里面的input[type=file]来实现,传递到后端的数据是以二进制的格式传递,所以上传图片的请求与普通的请求稍微 ...

  6. 用html5文件api实现移动端图片上传&预览效果

    想要用h5在移动端实现图片上传&预览效果,首先要了解html5的文件api相关知识(所有api只列举本功能所需): 1.Blob对象  Blob表示原始二进制数据,Html5的file对象就继 ...

  7. HTML5移动端图片上传模块

    上传图片的功能是极为常用的,之前做过一个移动端上传文件的功能(基于jquery的),总结梳理一下. html <div class="uploadPic clearBox"& ...

  8. H5 实现图片上传预览

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. Js 之移动端图片上传插件mbUploadify

    一.下载 https://pan.baidu.com/s/1NEL4tkHoK4ydqdMi_hgWcw 提取码:vx7e 二.Demo示例 <div class="weui_uplo ...

随机推荐

  1. day3之装饰器

    1.什么是装饰器? #在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证 2.装饰器的形成过程 # 需求写一个函数测试另一个函数的执行效率 最初的实现方式,但是改变 ...

  2. 命令行中开启mySQL数据库服务

    sudo /Applications/XAMPP/xamppfiles/bin/mysql.server start  

  3. 一个用css写出来的下拉菜单

    1 <style> 2 /* css*/ 3 #body{ 4 float: left; 5 } 6 #xialakuang{ 7 background-color:#f9f9f9; 8 ...

  4. 1028. Hanoi Tower Sequence

    1028. Hanoi Tower Sequence Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Hanoi Tow ...

  5. Ansible Ad-Hoc命令

    -a:传入模块的参数,不同的模块要传入的参数不同 -B SECOND:当任务放到后台执行异步任务,设置程序运行的超时时间,传入的是一个数值,单位秒 -C:测试该任务能否正常运行,不对被管理主机做出任何 ...

  6. Java中对比两个对象中属性值[反射、注解]

    在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...

  7. [ACM_数据结构] Color the ball [线段树水题][数组开大]

    Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次 ...

  8. 使用Postman验证TFS Rest API

    概述 你可能已经了解到,TFS自2015版本发布以来,开始支持通过REST API的方式提供接口服务,第三方平台可以通过通用的HTTP协议访问TFS系统,获取数据.请求编译等.REST API在原有. ...

  9. NET 文件批量下载

    HTML <a class="btn btn-warning" id="btnDownload">选中下载</a> JS /* 批量下载 ...

  10. signalR常见问题

    一.安装signalR会对应安装自己的NewJson包,如果引用了含有不同NewJson包的dll组件,会造成版本不一致.必须在运行环境中指出使用目标版本. 问题截图: 解决方式: <runti ...