掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
用相機(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)了問題,代碼如下:
function get_image_info($target, $allowswf = false) { $ext = discuz_upload::fileext($target); $isimage = discuz_upload::is_image_ext($ext); if(!$isimage && ($ext != 'swf' || !$allowswf)) { return false; } elseif(!is_readable($target)) { return false; } elseif($imageinfo = @getimagesize($target)) { list($width, $height, $type) = !empty($imageinfo) ? $imageinfo : array('', '', ''); $size = $width * $height; if($size > 16777216 || $size < 16 ) { return false; } elseif($ext == 'swf' && $type != 4 && $type != 13) { return false; } elseif($isimage && !in_array($type, array(1,2,3,6,13))) { return false; } elseif(!$allowswf && ($ext == 'swf' || $type == 4 || $type == 13)) { return false; } return $imageinfo; } else { return false; } }
這個(gè)方法就是獲取圖片的信息,而返回的值就是真或者假,而為假的時(shí)候就提示非法,為真的時(shí)候驗(yàn)證通過,上傳流程正常執(zhí)行。而其中就有一個(gè)$size變量,它的值是通過獲取圖片的長(zhǎng)寬,然后長(zhǎng)寬乘積得到,默認(rèn)是16777216,開根之后是4096,也就是超過4096*4096px的圖片就會(huì)之前的報(bào)錯(cuò)。而開始的時(shí)候我們上傳的是5000*4000=2000000,這個(gè)值是大于設(shè)定的臨界的,于是就返回flase。
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流