千万级流量H5应用必须懂的技能点

在我们日常工作中会碰到很多图片处理业务,如图片上传,图片压缩,图片存储、缩略图等,今天给大家分享在H5应用中和图片处理相关的常用技术点。本文所采用的example如果不能下载 请访问


http://www.imwinlion.com/archives/158

假设我们有这么一个场景,母亲节来啦,客户需要一个晒图的h5小应用,每个用户只要晒一张母亲的图,写上一句对母亲的祝福,分享到朋友圈,就能获得一次抽奖的机会。

那这个H5小应用有哪些技术点和难点呢?

1、关于JS前端图片压缩

这个场景的难点在于图片压缩,为什么是图片预处理呢?首先,因为当前用户基本上是大屏手机,一个图1-4M,是很正常的,但是用户参与活动的时候,未必愿意花这个流量,这样这个活动关上传图片这一步,就会降低很多用户参与的欲望了。其次,用户的网络状态未必很好,虽然用户3G很普遍,4G成规模,WIFI热点也很多,但是上传这么大的一张图,以2M估算,每秒上传速度100KB,也要20秒,难保这20秒时间网络不出任何差错。再次,用户未必愿意等待这么长的时间。解决方案在哪里?,答案是前端压缩,这里笔者常用的插件是lrz下载地址如下,也给个demo,

$('#uploadphoto').localResizeIMG({

width:400,

quality:1,

success:function(result){

varsubmitData={

data:result.clearBase64,

};

$('.loading').show();

$("#prevImg").attr("src",result.base64);

$.ajax({

type:"POST",

url:"{:U('Album/uploadb64',array('id'=>$appid))}",

data:submitData,

dataType:"json",

success:function(data){

$("#prevImg").attr("src",data.url);

$('#imgurl').val(data.url);

$('.loading').hide();

},

complete:function(XMLHttpRequest,textStatus){

$('.loading').hide();

},

error:function(XMLHttpRequest,textStatus,errorThrown){//上传失败

alert("额,出错了,请上报给管理员吧");

$('.loading').hide();

}

});

}

});

复制代码点击这里下载 localresizeimg,如果不能下载,请访问http://www.imwinlion.com/archives/158

2、关于图片异步上传

用户在提交图片的时候,我们需要好的用户体念,必须要使用异步上传插件,这里百度一下,有很多,但一般太重,引入的文件太多,笔者推荐自己写的 jquery.attach.js,3KB,功能强大,文档见

jquery.attach.js,简单好用的文件上传插件

http://www.imwinlion.com/archives/143

3、关于base64图片存储问题

一般图片在前端通过JS压缩后,会以base65的格式存储起来,然后上传到后端,那么后端怎么进行存储呢?这里用php示意functionbase64toimage($strBase64,$dstPath){

$ifp=fopen($dstPath,"wb");

fwrite($ifp,base64_decode($strBase64));

fclose($ifp);

return($dstPath);

}

复制代码其中$strbase64是前端通过lzrz控件传递过来的base64字符串,$dstPath 是文件存储的目标路径

如果自己用jquery ajax 异步上传base64文件需要注意,因为jquey 会把其中特殊的几个字符转码掉,因此最好用urlencode 处理掉再通过ajax 传输,后端用urldecode解码后再处理base64 内容

4、如何设计图片文件存储的名称和路径策略

这个问题的实质是如何设计上节 的$dstPath问题。是为什么会有这个问题呢?笔者在日常开发种发现很多图片存储无设计, 所以的到的图片大概是这样的

http://www.imwinlion.com/wp-content/uploads/2016/04/新建图像-300×300.png

像这种图片结构,在应用根目录下新建一个upload 文件夹,然后下面分日期/uploads/2016/04/ 在小型的应用中,还能将就着用的,但是一旦图片数目多起来,并且要存储的是图片的id时,我们该怎么做呢?笔者研读阿里的 fastfs,并经过大量的应用实践,积累了一套实用好操作的图片命名策略,如下

[hostid][level][dirstr][filename][suffix]

这种名称策略怎么理解呢?

hostid:图片服务器资源ID.这个涉及到我们自身的服务器资源规划问题。自定义的,比如我们应用占用了俩台服务器资源,一台是应用服务器,我们编号为0,一台是资源服务器,我们将这个服务器资源编号为1,这个数据就是hostid

level:相对于图片服务根目录来说,图片存储的文件夹目录深度,一般为俩层。比如我们存储的根目录为 /mnt/h5app/,那么这下面 的 目录 a/b/c,level就是3

dirstr:目录字符串,如上,目录字符串就是abc

filename: md5 策略或者uuid 策略生成 的文件名,如md5(microtime() . mt_rand(1000,9999));

suffix:文件的后缀,如.jpg,.png

举个列子。假设我们的应用服务器服务器,编号是0,根目录是/alidata/www/www.imwinlion.com/ ,对应的域名是www.imwinlion.com

我们的图片服务器有三台,一台编号是1,目录是/mnt/www.imwinlion.com/ ,对应的域名是res1.imwinlion.com

另一台编号是2,根目录是/mnt/www.imwinlion.cn/,对应的域名是res2.imwinlion.com

现在,我们根据我们设计的文件存储策略,假设名称是13abc01f9c76ce5c45aeec2e6f816c95b854b.jpg,那么根据问价夹的第1位数字,知道这个文件hostid 是1,

应该存放在编号为1的服务器,也就是/mnt/www.imwinlion.com/ 下

根据第二个参数level 为3,我们知道这个文件有3个父级子目录,那么接下来的三个字母abc 就是dirstr , 接下来的01f9c76ce5c45aeec2e6f816c95b854b 是md5 生成的随机字符串

最后.jpg 是文件格式,那么这个文件的存储路径应该是这样

/mnt/www.imwinlion.com/a/b/c/13abc01f9c76ce5c45aeec2e6f816c95b854b.jpg

对应访问地址是这样 http://res1.imwinlion.com/a/b/c/13abc01f9c76ce5c45aeec2e6f816c95b854b.jpg,文件id 就是文件名称 13abc01f9c76ce5c45aeec2e6f816c95b854b.jpg

我们数据库存这个id ,前端只要根据策略和这个ID就能够获得 图片路径

这种策略的核心在于先根据业务逻辑规划出图片存放路径。是先知道了文件路径,然后再存储。但是我们常用的框架,把文件的命名策略封闭起来了,我们只能先存起来,再获得文件名。这需要改造!!

5、图片的服务器端自动缩略图

服务器端自动缩略图机制有很多,有应用自动缩略图,比如php我们可以选择 timthumb.php 。 点击下面下载

timthumb 如果不能下载,请访问http://www.imwinlion.com/archives/158

采用该机制需要注意 ,132 行左右

你需要把你的 域名添加到$ALLOWED_SITES 数组中,// If ALLOW_EXTERNAL is true and ALLOW_ALL_EXTERNAL_SITES is false, then external images will only be fetched from these domains and their subdomains.

if(!isset($ALLOWED_SITES)){

$ALLOWED_SITES=array(‘youhost.com’,’imwinlion.com’);

}

复制代码

笔者采用的是另外一种。自建nginx 图片服务器,安装image_filter 模块

server{

listen80;

server_name img.imwinlion.com;

index index.html index.htm index.php;

root/alidata/mnt/imwinlion;

location~.*\.(php|php5)?$

{

fastcgi_pass127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi.conf;

}

location~(.*)\.(gif|jpg|jpeg|png|PNG|JPG|JPEG)\!(\d+)x(\d+)$

{

try_files $1.$2/emptylast;

image_filter_interlace on;

image_filter_jpeg_quality90;

image_filter resize $3 $4;

image_filter_buffer3M;

}

location~.*\.(gif|jpg|JPG|PNG|GIF|BMP|jpeg|png|bmp|swf)$

{

expires30d;

}

location~.*\.(js|css)?$

{

expires1h;

}

access_log/dev/null;

}


推荐一下本人目前正在写的一本书

互联网入门级编码人员,设计师,产品经理,系统后端工程师,DBA,以及想懂一点点技术的老板--你们可以把这本书买回去,送给和你一起创业兄弟们。

本书地址    http://yuedu.baidu.com/ebook/977275a5767f5acfa0c7cd55

部分目录如下,本人微信号betaniao,加我请写   简叔推荐


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容