PHP - 复制$ _FILES超全局

时间:2011-10-21 21:16:25

标签: php image function

我有一个PHP函数,我经常使用它来处理图像(调整大小,水印,转换为灰度等)。我很满意,效果很好。但是,它被设计为与$ _FILES超全局一起使用,并将其作为参数接受。

我遇到的情况是,我的服务器上有一个现有的文件目录,我需要处理的方式与从表单上传到$ _FILES数组的文件一样。

确定使用现有函数最容易,我一直在寻找复制$ _FILES超全局的方法,所以我可以将它传递给我的脚本,但我找不到我需要的函数/属性完成这个。 (虽然乍一看,getimagesizefilesize函数看起来可能会有所帮助。)

任何人都可以建议我需要复制$ _FILES数组的功能/属性吗? (或者另一种方法来完成我想要做的事情?)

为了参考,我使用的图像功能在这里:

function resize_upload ($file, $dest, $maxw = 50, $maxh = 50, $grey = false, $wm = false, $mark = "a/i/watermark.png", $opa = 40) {     
    $allowext = array("gif", "jpg", "png", "jpeg", "bmp");      
    $fileext = strtolower(getExtension($file['name'])); 
    if (!in_array($fileext,$allowext)) {
        echo "Wrong file extension.";
        exit();
    }
    list($width, $height, $imgcon) = getimagesize($file['tmp_name']);   
    if ($file['size'] && ($width > $maxw || $height > $maxh)) {     
        if($file['type'] == "image/pjpeg" || $file['type'] == "image/jpeg"){$newimg = imagecreatefromjpeg($file['tmp_name']);}
        elseif($file['type'] == "image/x-png" || $file['type'] == "image/png"){$newimg = imagecreatefrompng($file['tmp_name']);}
        elseif($file['type'] == "image/gif"){$newimg = imagecreatefromgif($file['tmp_name']);}          
        $ratio = $width/$height;
        if ($ratio < 1) { // Width < Height
            $newheight = $maxh;
            $newwidth = $width * ($maxh/$height);
            if ($newwidth > $maxw) {
                $newheight = $newheight * ($maxw/$newwidth);
                $newwidth = $maxw;              
            }
        } elseif ($ratio == 1) { // Width = Height
            if ($maxw < $maxh) {
                $newheight = $maxw;
                $newwidth = $maxw;
            } elseif ($maxw == $maxh) {
                $newheight = $maxh;
                $newwidth = $maxw;
            } elseif ($maxw > $maxh) {
                $newheight = $maxh;
                $newwidth = $maxh;
            }
        } elseif ($ratio > 1) { // Width > Height           
            $newwidth = $maxw;
            $newheight = $height * ($maxw/$width);
            if ($newheight > $maxh) {
                $newwidth = $newwidth * ($maxh/$newheight);
                $newheight = $maxh;
            }
        }       
        if (function_exists(imagecreatetruecolor)) {$resize = imagecreatetruecolor($newwidth, $newheight);}             
        if (($imgcon == IMAGETYPE_GIF)) {
            $trnprt_indx = imagecolortransparent($newimg);
            if ($trnprt_indx >= 0) {
                $trnprt_color = imagecolorsforindex($newimg, $trnprt_indx);
                $trnprt_indx = imagecolorallocate($resize, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
                imagefill($resize, 0, 0, $trnprt_indx);
                imagecolortransparent($resize, $trnprt_indx);
            }
        } elseif ($imgcon == IMAGETYPE_PNG) {
            imagealphablending($resize, false);
            $color = imagecolorallocatealpha($resize, 0, 0, 0, 127);
            imagefill($resize, 0, 0, $color);
            imagesavealpha($resize, true);
        }
        imagecopyresampled($resize, $newimg, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
        if ($wm) {
            $watermark = imagecreatefrompng($mark);
            $wm_width = imagesx($watermark);
            $wm_height = imagesy($watermark);
            $destx = $newwidth - $wm_width - 5;
            $desty = $newheight - $wm_height - 5;
            imagecopymerge($resize, $watermark, $destx, $desty, 0, 0, $wm_width, $wm_height, $opa);
            imagedestroy($watermark);
        }
        $filename = random_name().".".$fileext;
        if ($grey) {imagefilter($resize, IMG_FILTER_GRAYSCALE);}
        if($file['type'] == "image/pjpeg" || $file['type'] == "image/jpeg"){$new = imagejpeg($resize, $dest."/".$filename, 100);}
        elseif($file['type'] == "image/x-png" || $file['type'] == "image/png"){$new = imagepng($resize, $dest."/".$filename, 0);}
        elseif($file['type'] == "image/gif"){$new = imagegif($resize, $dest."/".$filename);}        
        imagedestroy($resize);
        imagedestroy($newimg);      
        return $filename;
    } elseif ($file['size']) {
        $filename = random_name().".".getExtension($file['name']);
        if ($grey) {
            if($file['type'] == "image/pjpeg" || $file['type'] == "image/jpeg"){$newimg = imagecreatefromjpeg($file['tmp_name']);}
            elseif($file['type'] == "image/x-png" || $file['type'] == "image/png"){$newimg = imagecreatefrompng($file['tmp_name']);}
            elseif($file['type'] == "image/gif"){$newimg = imagecreatefromgif($file['tmp_name']);}
            imagefilter($newimg, IMG_FILTER_GRAYSCALE);
            if($file['type'] == "image/pjpeg" || $file['type'] == "image/jpeg"){imagejpeg($newimg, $dest."/".$filename);}
            elseif($file['type'] == "image/x-png" || $file['type'] == "image/png"){imagepng($newimg, $dest."/".$filename);}
            elseif($file['type'] == "image/gif"){imagegif($newimg, $dest."/".$filename);}
            imagedestroy($newimg);
            return $filename;
        } else {
            $upload = file_upload($file, $dest);
            return $upload;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

$ _FILES数组包含上传文件的嵌套数组。这个嵌套数组有5个键。对于每个键,我解释它应该包含什么,以及使用什么函数:

  • name :文件名,使用 basename()函数输入此条目
  • 类型:文件的mime类型,设置为'image / png','image / jpeg'等的图像
  • tmp_name :实际文件的路径,此处应设置图片的路径
  • 错误:这表示上传时出错,在您的情况下,您可以将其设置为0表示没有错误
  • 大小:文件大小(以字节为单位),因此您可以使用 filesize()功能为您的图像

一个例子:

$_FILES = array('image' => array(
    'name' => basename('/path/to/image.png'),
    'type' => 'image/png',
    'tmp_name' => '/path/to/image.png',
    'error' => 0,
    'size' => filesize('/path/to/image.png')
));

如果你想一次处理多个文件,你应该知道$ _FILES数组的结构与你在这种情况下所期望的结构不同,请参阅PHP文档中的this comment