2014-12-24 171 views
0

我一直在尝试从HTML表单获取文件,然后创建一个新文件,并使用“imagecopyresampled”从中获取中央方形,拟合X或Y,取决于哪个更小。PHP GD上传前调整大小/裁剪图像

不幸的是,我对处理这么多的图像和临时名称感到有点困惑,我一直有麻烦将文件复制到系统上的用户文件。 的代码如下:

所有的
if($_FILES){ 
    $valid = validate_image("avatar"); 

    if ($valid){ 
     list($width, $height, $type) = getimagesize($_FILES['avatar']['tmp_name']); 

     $scale = $width/$height; 
     $pixels = 150; 
     $tmp_name = $_FILES['avatar']['tmp_name']; 

     switch ($type) { 
      case IMAGETYPE_GIF: 
       $source = imagecreatefromgif($tmp_name); 
       break; 

      case IMAGETYPE_JPEG: 
      case IMAGETYPE_JPG: 
       $source = imagecreatefromjpeg($tmp_name); 
       break; 

      case IMAGETYPE_PNG: 
       $source = imagecreatefrompng($tmp_name); 
       break; 
     } 

     $upload = imagecreatetruecolor($pixels, $pixels); 

     //sketchy image math: Get whichever coordinate is smaller and that will be 150 on the thumbnail from top to bottom (or left to right). 
     //Then for the other one you know the size will be 150, but only for the part starting at (Coordinate/2)-SMALLERCOORD/2 to (coord/2)+SMALLERCOORD/2 

     if ($width>$height){ 
      imagecopyresampled ($upload, $source, 0, 0, 0, ($width-$height/2), 150, 150, $height, $height); 
     } else if ($width<=$height){ 
      imagecopyresampled ($upload, $source, 0, 0, 0, ($height-$width/2), 150, 150, $width, $width); 
     } 

     $name = "./users/$id/avatar.png"; 

     imagepng($upload, $tmp_name); 

     if (!(move_uploaded_file($tmp_name, $name))) $fail .= "<h3>ERROR UPLOADING AVATAR. TRY AGAIN LATER OR CONTACT US.</h3><br>"; 
    } 
} 

首先让我看看,如果我理解这些代码是如何工作的正确: 我得到的文件,检查它是否与我的功能有效。然后我得到它的大小和类型。我检查类型并在服务器内存上创建一个映像,并在另一个空间上创建一个我想要的映像。然后,我实际上复制了我创建的上传图像上调整大小和裁剪后的图像。 如果我想要,我可以用imagedestroy删除临时的“源”图像,对吧? 接下来,我尝试从服务器内存的“上传”图像中创建一个png文件。 这里是我认为我错了,我不能覆盖临时文件,我可以吗? 然后我尝试将图像临时图像放在应该上传但不起作用的地方。

我是否正确?我怎样才能解决这个问题? 感谢您的关注。

回答

0

因此,在网上搜索了很多后,我发现最大的问题是运行apache(www-data)的用户。

因此我输入了/ etc/apache2/envvars并将APACHE_RUN_USER更改为该文件夹的所有者。 然后我不得不在/ etc/lib/php5上做一个chown,以便会话可以坚持/与新用户一起工作。

因此,我现在能够访问该文件夹,以便服务器能够在其上编写和修改。 然后我加入这部分代码:

$dir = "./users/$id/"; 
$oldumask = mask(0); 
mkdir ("$dir"); 
chmod("$dir", 0750); 
umask($oldumask); 

将其加入右侧创建PNG图像之前。 然后我删除了“move_uploaded_file”的代码,只是使用的imagepng功能雅各布Budin建议:

if(!imagepng($upload, $name)) $fail .= "<h3>ERROR!<h3><br>"; 

这解决一切(但事实证明,裁剪代码是错误的,但是这是不相关)。 我仍然不是100%确定GD/PHP如何处理图像,但这是有效的。 谢谢你和圣诞快乐人人。

0

有关缩略图生成的逻辑不正确,但更紧迫的问题是保存图像文件。您试图保存在文件系统的根目录(/users/$id/avatar.png),可能没有这样做的权限。

尽管您可以保存回上传路径,但这不是必需的。在imagepng中,只需将文件保存到您的目的地(例如,/var/web/app/public/uploads/$id/avatar.png)。您还可以使用魔术常数__DIR__指定执行相关PHP文件的路径。

就裁剪而言,考虑使用预先构建的函数或库来生成缩略图。我可以在这里复制一些代码,但其他人已经殴打这个问题很多次(并解决了其他潜在问题,如透明度)。您可以在imagecopyresampled上查看文档(和用户意见),或使用复杂的库(如Imagine)。

+0

我的错误。它不是“/users/$id/avatar.png”。编辑代码时,我删除得太多了,它应该是相对于PHP文件的路径。 “./users/$id/avatar.png”。因此,PHP代码所在的同一目录中的用户文件夹。 –