场景:
1、使用cropper裁剪图片、html2canvas合成图片后将图片上传至顽兔空间
2、运行环境手淘、天猫
3、C2B定制
采用方案及遇到的问题:
1、IOS+手淘/天猫环境无法使用顽兔Jssdk上传(由于走后台绕一圈必然浪费时间和性能,所以判断如果是Android则依然使用Jssdk)
2、使用js FormData,没有图片太大而无法上传的问题。然而IOS+手淘/天猫环境依然无法使用
canvas.toBlob(function(blob) {
var formdata=new FormData();
formdata.append('file',blob);
$.ajax({
url : url,
data : formdata,
processData : false,
contentType : false,
dataType: 'json',
type : "POST",
success : function(data){}
});
}, "image/png", 1.0);
3、转成base64字符串传递到后台(Android/IOS+手淘/天猫都可行)。但是图片一大就无法传输,直接进ajax的error了。
方案a:损失少量精度的情况下增加压缩率,使用jpeg格式
canvas.toDataURL("image/jpeg", 1.0);
canvas.toDataURL("image/jpeg", 0.9);
ajax:
data : {
dataUrl: dataUrl.split(',')[1]
}
客户:有的图片太小了,连1M都不到。我:好的,马上改(mmp,包装那么小,明明大几百K的jpeg已经够清楚了)
方案b:还是采用无损的png,增加post方式提交数据的大小限制:
js:
canvas.toDataURL("image/png");
if(convertBase64UrlToFile(dataUrl).size < (1024 * 1024)) {
Tida.toast("亲,裁剪图片小于1M会影响包装效果,请缩放裁切区域或上传更清晰的照片试试!");
Tida.hideLoading();
upBgPicAccess = 1;
return;
}
服务器配置:
tomcat/conf/server.xml的Connector节点添加属性maxPostSize="8000000"#设置成0,负值都无效
本地maven jetty运行配置:启动命令添加:
jetty:run -Djetty.port=80 -Dorg.eclipse.jetty.server.Request.maxFormContentSize=5000000
使用阿里云Docker Tomcat镜像创建容器的话,处理上述问题有个坑:上述添加的属性需要添加在/acs/user/tomcat/conf/server.xml.temp,因为每次启动容器时(/acs/bin/start),会先删除server.xml,然后复制server.xml.temp到server.xml:
ps:cropper用起来很爽,效果也不错;html2canvas去官网下载最新的版本,老的版本兼容性差一些!