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. 实现字符串函数,strlen(),strcpy(),strcmp(),strcat()

    实现字符串函数,strlen(),strcpy(),strcmp(),strcat() #include<stdio.h> #include<stdlib.h> int my_ ...

  2. Linux服务器部署系列之七—OpenLDAP篇

    LDAP(轻量级目录访问服务),通过配置这个服务,我们也可以在linux下面使用目录的形式管理用户,就像windows下面的AD一样,方便我们管理.下面我们就一起来配置openldap服务.本文运行环 ...

  3. Ubuntu14.04下安装Cuda8.0

    https://blog.csdn.net/sinat_19628145/article/details/60475696 https://developer.nvidia.com/cuda-down ...

  4. POJ3104 Drying 2017-05-09 23:33 41人阅读 评论(0) 收藏

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15604   Accepted: 3976 Descripti ...

  5. CG图形学的工具

    1. http://give.zju.edu.cn/cgcourse/new/frame/index.html 网页CG学习

  6. shell 脚本 删除文件内容为空的文件

    #!/bin/bask # cd /tmp for a in * ;do if [ ! -s $a ] ;then #[ ! -s $a ] 文件为空返回为真 rm -rf $a fi done 测试 ...

  7. 【 PLSQL Developer安装、tnsnames.ora配置 解答】

    使用plsql远程连接数据库需要安装plsql工具+ oracle的远程客户端 在不登录的状态打开plsql: 点击工具---首选项:指定oracle客户端的安装路径: C:\javaSoft\PLS ...

  8. docker 多阶段构建

    构建镜像最具挑战性的一点是使镜像大小尽可能的小.Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件.对于多阶段构建,您可以在Dockerfile中 ...

  9. 编程哲学之C#篇:02——学习思维

    <代码大全>的第二章:介绍隐喻(类比)的思维方式, <经济学原理>的第二章:介绍怎么像经济学家一样思考, <计算机的心智操作系统之哲学原理>的第一章:介绍学习操作系 ...

  10. map函数和reduce函数、filter函数的区别

    ①从参数方面来讲:map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数.reduce()函数 ...