使用PHP、Laravel、GD上传图像并将多个大小保存到文件系统
我试图允许用户上传一个图像,并将图像保存为目录中的“原始副本”使用PHP、Laravel、GD上传图像并将多个大小保存到文件系统,php,gd,laravel,image-resizing,image-uploading,Php,Gd,Laravel,Image Resizing,Image Uploading,我试图允许用户上传一个图像,并将图像保存为目录中的“原始副本” public_html/data/user_images/yyyy/MM/dd/guid.ext 接下来,使用GD创建不同大小的图像的多个副本,并保存到文件系统中的另一个动态位置 public_html/data/user_images/width/yyyy/MM/dd/guid.ext 我不断遇到以下错误,这使我相信,在使用GD库保存一个经过处理的图像之前,文件必须已经存在 imagejpeg(/data/user_im
public_html/data/user_images/yyyy/MM/dd/guid.ext
接下来,使用GD创建不同大小的图像的多个副本,并保存到文件系统中的另一个动态位置
public_html/data/user_images/width/yyyy/MM/dd/guid.ext
我不断遇到以下错误,这使我相信,在使用GD库保存一个经过处理的图像之前,文件必须已经存在
imagejpeg(/data/user_images/200/2013/05/21/9714624e10eed645e822babd0acccf69ac421d59.png):
failed to open stream: No such file or directory
我在相对路径和绝对路径上都得到了相同的错误。我知道这个目录或文件不存在。当保存上传图像的原始副本时,代码按预期工作,我只是无法在动态目录中创建一个新的
下面是我的图像助手的代码。作为参数,它获取原始保存的图像位置、大小数组和新图像的文件名。createDirectories函数返回一个数组,其中包含动态创建的绝对路径和相对路径
public static function create_sizes($image, $sizes, $filename){
$current_size = GetimageSize($image);
$urls = array();
switch(strtolower($current_size['mime'])){
case 'image/png':
$image_original = imagecreatefrompng($image);
break;
case 'image/jpeg':
$image_original = imagecreatefromjpeg($image);
break;
case 'image/gif':
$image_original = imagecreatefromgif($image);
break;
default: die();
}
foreach($sizes as $width){
$directories = self::createDirectories('user_images/'.$width);
$aspect_ratio = $current_size[0] / $current_size[1];
$height = (int) ($width / $aspect_ratio);
$photoX = ImagesX($image_original);
$photoY = ImagesY($image_original);
$image_new = ImageCreateTrueColor($width, $height);
ImageCopyResampled($image_new, $image_original, 0, 0, 0, 0, $width+1, $height+1, $photoX, $photoY);
ImageJPEG($image_new, $directories['absolute'].$filename, 100);
array_push($urls, $directories['relative'].$filename);
}
ImageDestroy($image_original);
ImageDestroy($image_new);
return $urls;
}
快速查看一下我的ImageProcessor类。我认为这将有助于你: 用法: 当用户上载文件时,它的名称在$\u FILES['input\u name']['tmp\u name']中。 因此,首先创建我的类的空实例:
$OriginalImage = new ImageProcessor();
//Note that it will automatically detect the file type :)
if(!$OriginalImage->Load($_FILES['input_name']['tmp_name']))
die('Image is invalid');
现在,您必须选择调整大小的方法。
您可以强制图像具有固定的宽度或高度,或具有您选择的确切大小,但如果不适合,则将在黑色背景上显示
Fixed width:
$NewImage = $OriginalImage->ResizeWPreserve($NewWidth)
Fixed height:
$NewImage = $OriginalImage->ResizeHPreserve($NewHeight)
Fixed size:
$NewImage = $OriginalImage->ResizeCanvas($NewWidth, $NewHeight)
Then, to save it, simply:
$NewImage->Save('FileName.jpg');
可以在循环中重复“保存”并调整大小,如:
$Sizes = array(640, 800, 1024);
foreach($Sizes as $Width)
{
$OriginalImage->ResizeWPreserve($Width)->Save(sprintf('Images/%s/%d.jpg', 'SomeName', $Width));
}
类好的,您的代码使我确信我当前所做的是正确的。此时,imagepng($this->I,$OutFile);在你的代码中,我得到了一个错误。这可能是权限问题吗?我似乎无法用GDM创建新的目录或文件。你要将文件放入的目录必须存在。是的,我修改了我的代码,现在它工作得很好。我创建了一个主映像为yyyy/MM/dd/的目录,并将其大小附加到文件名中。谢谢你帮我做这件事