2012-12-31 178 views
0

我有一個PHP腳本我正在使用將上傳的圖像轉換成一半的質量,所以我可以節省服務器空間,但它不工作我是新來的PHP,所以希望有人可以幫助我在哪裏出錯。php png圖像質量50%

if(isset($_FILES['t1']['name'])){ 
    $file = rand(0, 10000000).$_FILES['t1']['name']; 
    if (move_uploaded_file($_FILES['t1']['tmp_name'], $file)) { 
     if($fp = fopen($file,"rb", 0)) 
     { 
      $picture = fread($fp,filesize($file)); 
      fclose($fp); 
      $img = imagecreatefrompng($file); 
      imagepng($img, $file, 6); //6 quality setting 
      imagedestroy($img); 
      $tag1 = '<img src="'.$file.'" alt="" class="default" />'; 
//unlink($file); 
echo "<script>$(document).ready(function() {var write = $('.item:nth-child(1)').html();localStorage.item1Pantry = write;});</script>";  
     } 
    } 


} 

回答

2

PNG是無損壓縮。當你將「質量」設置爲6時,你實際上只是使用平庸的壓縮方法,可能會佔用更多的空間。使用9作爲最高壓縮率(以CPU使用率略高爲代價,除非您正在進行批處理,否則幾乎不會引人注意)。

您可能還會考慮Yahoo!'s image compression,以獲得更多無損優化。

此外,你真的不應該讓用戶指定文件名,即使是部分。如果有人上傳remote_control_script.php,你不會太高興。不要相信用戶上傳的內容。

+0

+1對於安全警告! –

+0

有沒有辦法強制用戶上傳png文件? – Blynn

+0

@Blynn,不,你可以做的只是稍後檢測文件類型服務器端(通過實際檢查文件數據,而不僅僅是查看擴展名!)。即使如此,過去在圖像庫中也存在已知的漏洞。在網絡文檔根目錄之外,按順序編號命名您的文件或不帶文件擴展名的文件。用一個從數據庫獲取文件數據的PHP腳本來爲它們服務。然後,您甚至可以使用建議的文件名與用戶最初擁有的內容一起返回它們,同時防止服務器端執行。 – Brad