PHP - дублирование суперглобального $ _FILES - PullRequest
1 голос
/ 22 октября 2011

У меня есть функция PHP, которую я регулярно использую для работы с изображениями (изменение размера, нанесение водяных знаков, преобразование в оттенки серого и т. Д.).Я счастлив с этим, и это работает хорошо.Однако он предназначен для работы с суперглобальным $ _FILES и принимает его в качестве параметра.

Я столкнулся с ситуацией, когда у меня на сервере есть существующий каталог файлов, которые мне нужно обработать втак же, как я делаю для файлов, загруженных из формы в массив $ _FILES.

Чтобы понять, как проще всего было бы работать с моей существующей функцией, я искал способ дублировать суперглобальный $ _FILES,поэтому я могу передать его в свой сценарий, но я не нахожу функции / свойства, необходимые для этого.(Хотя, на первый взгляд, функции getimagesize и filesize выглядят так, как будто они могут помочь).

Может кто-нибудь посоветовать, какие функции / свойства мне нужно дублироватьмассив $ _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 Ответ

3 голосов
/ 22 октября 2011

Массив $ _FILES содержит вложенный массив для загруженного файла. Этот вложенный массив имеет 5 ключей. Для каждого ключа я объясняю, что он должен содержать и какую функцию использовать:

  • name : имя файла, используйте функцию basename () для этой записи
  • type : MIME-тип файла, для изображений установлено значение «image / png», «image / jpeg» и т. Д.
  • tmp_name : путь к реальному файлу, здесь вы должны указать путь к вашим изображениям
  • ошибка : это указывает на то, что произошла ошибка при загрузке, в вашем случае вы можете установить ее на 0 без ошибок
  • size : размер файла в байтах, поэтому вы можете использовать функцию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...