繁体   English   中英

创建缩略图PHP问题

[英]Creating thumbnails PHP problem

我有这个源代码,是从net tutsplus获得的。 我已经配置了它并使它在一个PHP文件中工作。 它可以通过传输原始图像来工作,但不会生成到缩略图文件夹。

<?php

$final_width_of_image = 100;
$path_to_image_directory = "../../img/events/" . urldecode($_GET['name']) . "/";
$path_to_thumbs_directory = "../../img/events/" . urldecode($_GET['name']) . "/thumbnails/";

function createThumbnail($filename)
{
    if(preg_match('/[.](jpg)$/', $filename)) 
    {
        $im = imagecreatefromjpeg($path_to_image_directory . $filename);
    } 
    elseif(preg_match('/[.](gif)$/', $filename)) 
    {
        $im = imagecreatefromgif($path_to_image_directory . $filename);
    } 
    elseif(preg_match('/[.](png)$/', $filename)) 
    {
        $im = imagecreatefrompng($path_to_image_directory . $filename);
    }

    $ox = imagesx($im);
    $oy = imagesy($im);

    $nx = $final_width_of_image;
    $ny = floor($oy * ($final_width_of_image / $ox));

    $nm = imagecreatetruecolor($nx, $ny);

    imagecopyresized($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy);

    imagejpeg($nm, $path_to_thumbs_directory . $filename);
    $tn = '<img src="' . $path_to_thumbs_directory . $filename . '" alt="image" />';
    echo $tn;
}

if(isset($_FILES['fupload'])) {

    if(preg_match('/[.](jpg)|(gif)|(png)$/', $_FILES['fupload']['name'])) {

        $filename = $_FILES['fupload']['name'];
        $source = $_FILES['fupload']['tmp_name'];
        $target = $path_to_image_directory . $filename;

        move_uploaded_file($source, $target);

        createThumbnail($filename);
    }
}

?>

基本上应该生成一个上传图像的缩略图,并将原始图像存储到另一个文件夹中。

路径是正确的,它可以通过在URL中获取文件夹名称来工作,它可以工作,但对于缩略图文件夹则无效。

在问这个相关问题之前,是的,缩略图生成确实可以通过PHP GD在我的服务器上工作,我已经对其进行了单独测试。 所以这不是问题。 :)

我如何让它工作? :(

好吧,首先,使用imagecopyresampled() ,因为它将生成更好的缩略图。

其次,您不应为文件系统目录和url目录使用相同的变量。 您应该具有$filesystem_path_to_thumbs$url_path_to_thumbs 因此,您可以对其进行不同的设置。

第三,您可能要对宽度和高度都进行尺寸检查。 如果有人上传高大的图像会怎样? 您的缩略图将在目标框之外(但这可能不是大问题)。

第四,出于性能原因,在生成缩略图之前,您应该检查一下缩略图文件是否存在于thumbs目录中。

最后,它实际失败的原因是$final_width_of_image$path_to_image_directory$path_to_thumbs_directory在函数中未定义。 或者:

  1. 在函数开始时将它们设置为全局,因此您可以在函数global $final_width_of_image, $path_to_image_directory, $path_to_thumbs_directory;访问它们global $final_width_of_image, $path_to_image_directory, $path_to_thumbs_directory;

  2. 使它们成为函数的参数: function createTumbnail($image, $width, $path_to_images, $path_to_thumbs) {

  3. 在函数内部对其进行硬编码(将其声明从函数外部移至函数内部)。

就个人而言,我会做#2,但这取决于您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM