PHP GD在上传前调整/裁剪图像
我一直在尝试从一个HTML表单中获取一个文件,然后创建一个新的文件,并使用imagecopyresampled从中获取中心正方形,根据哪个更小,在X或Y上拟合 不幸的是,我对处理如此多的图像和临时名称感到有点困惑,并且在将文件复制到系统上的用户文件时遇到了麻烦。 代码如下:PHP GD在上传前调整/裁剪图像,php,image,upload,resize,php-gd,Php,Image,Upload,Resize,Php Gd,我一直在尝试从一个HTML表单中获取一个文件,然后创建一个新的文件,并使用imagecopyresampled从中获取中心正方形,根据哪个更小,在X或Y上拟合 不幸的是,我对处理如此多的图像和临时名称感到有点困惑,并且在将文件复制到系统上的用户文件时遇到了麻烦。 代码如下: if($_FILES){ $valid = validate_image("avatar"); if ($valid){ list($width, $height, $type) = get
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文件。
这就是我认为我搞错的地方,我不能覆盖临时文件,对吗?
然后我试着把这个临时图像放到应该上传的地方,但这不起作用
我说得对吗?如何修复此代码?
感谢您的关注。有关缩略图生成的逻辑不正确,但更紧迫的问题是保存图像文件。您试图保存在文件系统/users/$id/avatar.png的根目录中,可能没有这样做所需的权限 虽然您可以保存回上传路径,但这不是必需的。在imagepng中,只需将文件保存到您的目的地,例如/var/web/app/public/uploads/$id/avatar.png。您还可以使用magic常量指定相对于执行PHP文件的路径
就裁剪而言,考虑使用预构建的函数或库来生成缩略图。我可以在这里复制一些代码,但是其他人已经多次将这个问题击死,并修复了其他潜在的问题,比如透明度。您可以查看文档和用户评论,或者使用复杂的库,例如。因此,在在线研究了很多之后,我发现最大的问题是运行apache www数据的用户 因此,我输入/etc/apache2/envvars并将APACHE_RUN_用户更改为文件夹的所有者。 然后我不得不在/etc/lib/php5上做一个chown,这样会话就可以与新用户一起使用了 有了它,我现在可以访问这个文件夹,这样服务器就可以对它进行写入和修改。 然后我在代码中添加了以下部分:
$dir = "./users/$id/";
$oldumask = mask(0);
mkdir ("$dir");
chmod("$dir", 0750);
umask($oldumask);
这是在创建png图像之前添加的。
然后,我删除了move_上传的文件代码,只使用了Jacob Budin建议的imagepng函数:
if(!imagepng($upload, $name)) $fail .= "<h3>ERROR!<h3><br>";
这解决了所有问题,但裁剪代码是错误的,但这并不重要。
我仍然不能100%确定GD/PHP如何很好地处理图像,但这是可行的。
谢谢大家,圣诞快乐。我错了。它不是/users/$id/avatar.png。我在编辑代码时删除了太多内容,应该是相对于PHP文件的路径/users/$id/avatar.png。因此,用户文件夹位于PHP代码所在的同一目录中。