用相機(jī)拍的照片的分辨率是特別高的权她,分辨率達(dá)到3000*5000px以上級(jí)別,這么高的圖片的品質(zhì)肯定是杠杠的,但在網(wǎng)頁上面來講確實(shí)太大了瘤睹,因?yàn)槲覀兤胀ǖ木W(wǎng)頁也用不著展示這么高清這么大的圖片。我覺得原因有二:一是因?yàn)槲覀兤胀ǖ木W(wǎng)頁確實(shí)不需要這么大的答倡;二是這么大的圖片通常有好幾兆甚至十幾兆大小轰传,這樣頁面的加載速度回很慢的。
我們?cè)贒iscuz中遇到一個(gè)問題瘪撇,那就是上傳某些圖片的時(shí)候提示“沒有合法的文件被上傳”获茬,而不是說您上傳的文件太大了港庄。想到不合法通常會(huì)想到的是圖片的格式不對(duì),不是普通的jpg或者png之類的恕曲,而是其他的非主流的圖片格式鹏氧。但不管把這樣的圖片轉(zhuǎn)變成png還是jpg都不能上傳,但吧圖片一縮小卻是可以上傳的佩谣。這樣不就是因?yàn)槲募笮〉膯栴}么度帮?(越大一般來講文件體積也越大)。但檢查后發(fā)現(xiàn)文件體積并沒有超過網(wǎng)站限制以及對(duì)應(yīng)服務(wù)器的php配置稿存。
但當(dāng)我創(chuàng)建了一個(gè)5000*4000px空白圖片的時(shí)候卻不能上傳笨篷,而它的體積才645KB,遠(yuǎn)遠(yuǎn)低于限制的文件大小瓣履。于是開始分析源代碼了率翅,結(jié)果分析到class文件中發(fā)現(xiàn)了一個(gè)discuz_upload類,就是實(shí)現(xiàn)該上傳功能袖迎。而在其中的get_image_info方法中我們似乎就發(fā)現(xiàn)了問題冕臭,代碼如下:
functionget_image_info($target,$allowswf=false){
$ext=discuz_upload::fileext($target);
$isimage=discuz_upload::is_image_ext($ext);
if(!$isimage&&($ext!='swf'||!$allowswf)){
returnfalse;
}elseif(!is_readable($target)){
returnfalse;
}elseif($imageinfo=@getimagesize($target)){
list($width,$height,$type)=!empty($imageinfo)?$imageinfo:array('','','');
$size=$width*$height;
if($size>16777216||$size<16){
returnfalse;
}elseif($ext=='swf'&&$type!=4&&$type!=13){
returnfalse;
}elseif($isimage&&!in_array($type,array(1,2,3,6,13))){
returnfalse;
}elseif(!$allowswf&&($ext=='swf'||$type==4||$type==13)){
returnfalse;
}
return$imageinfo;
}else{
returnfalse;
}
}
這個(gè)方法就是獲取圖片的信息,而返回的值就是真或者假燕锥,而為假的時(shí)候就提示非法辜贵,為真的時(shí)候驗(yàn)證通過,上傳流程正常執(zhí)行归形。而其中就有一個(gè)$size變量托慨,它的值是通過獲取圖片的長寬,然后長寬乘積得到暇榴,默認(rèn)是16777216厚棵,開根之后是4096,也就是超過4096*4096px的圖片就會(huì)之前的報(bào)錯(cuò)蔼紧。而開始的時(shí)候我們上傳的是5000*4000=2000000婆硬,這個(gè)值是大于設(shè)定的臨界的,于是就返回flase奸例。
轉(zhuǎn)自:http://www.muquan.net/article/390.html