2012-12-31 142 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