PHP ООП загрузки изображений и манипуляции - PullRequest
0 голосов
/ 30 декабря 2011

Мне недавно удалось успешно подключить очень крутой плагин Valums File Upload к приложению, над которым я сейчас работаю, с целью загрузки изображений. Теперь мне нужно изменить сценарии PHP на стороне сервера для этого плагина, чтобы сделать некоторые манипуляции с изображениями (изменение размера, создание водяных знаков, создание эскизов и т. Д.), Которые я смог сделать до использования процедурного кодирования в стиле, но, глядя на путь обработка загрузки выполняется в плагине valums, все это ООП.

Так что я недавно провел некоторое время, пытаясь разобраться в стилях программирования ООП, и я думаю, что получил базовые знания, но я действительно мог бы использовать некоторые указатели (я НЕ прошу кого-то сделайте это для меня) относительно того, как внедрить то, что я хочу сделать в существующий код, например, куда должны идти мои методы манипулирования изображениями, как получить дескриптор загруженного файла.

Полный код для обработки на стороне сервера можно найти здесь , но в качестве обзора он выглядит примерно так (извините, он все еще довольно длинный):

<?php

/**
* Handle file uploads via XMLHttpRequest
*/
class qqUploadedFileXhr {

    function save($path) {
        $input = fopen("php://input", "r");
        $temp = tmpfile();
        $realSize = stream_copy_to_stream($input, $temp);
        fclose($input);

                // REMOVED VALIDATION

        $target = fopen($path, "w");
        fseek($temp, 0, SEEK_SET);
        stream_copy_to_stream($temp, $target);
        fclose($target);

        return true;
    }
    function getName() {
        return $_GET['qqfile'];
    }
    function getSize() {
            // REMOVED
    }
}

/**
* Handle file uploads via regular form post (uses the $_FILES array)
*/
class qqUploadedFileForm {

    function save($path) {
        if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){
            return false;
        }
        return true;
    }
    function getName() {
        return $_FILES['qqfile']['name'];
    }
    function getSize() {
        return $_FILES['qqfile']['size'];
    }
}

class qqFileUploader {
    private $allowedExtensions = array();
    private $sizeLimit = 10485760;
    private $file;

    function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){
        $allowedExtensions = array_map("strtolower", $allowedExtensions);

        $this->allowedExtensions = $allowedExtensions;
        $this->sizeLimit = $sizeLimit;

        $this->checkServerSettings();

        if (isset($_GET['qqfile'])) {
            $this->file = new qqUploadedFileXhr();
        } elseif (isset($_FILES['qqfile'])) {
            $this->file = new qqUploadedFileForm();
        } else {
            $this->file = false;
        }
    }

    private function checkServerSettings(){
            // REMOVED
    }

    private function toBytes($str){
            // REMOVED
    }

    /**
* Returns array('success'=>true) or array('error'=>'error message')
*/
    function handleUpload($uploadDirectory, $replaceOldFile = FALSE){

        // REMOVED VALIDATION

        $pathinfo = pathinfo($this->file->getName());
        $filename = $pathinfo['filename'];
        //$filename = md5(uniqid());
        $ext = $pathinfo['extension'];

                // REMOVED VALIDATION

        if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){
            return array('success'=>true);
        } else {
            return array('error'=> 'Could not save uploaded file.' .
                'The upload was cancelled, or server error encountered');
        }

    }
}


$allowedExtensions = array("jpeg","jpg","bmp");
// max file size in bytes
$sizeLimit = 10 * 1024 * 1024;

$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
$result = $uploader->handleUpload('uploads/');
// to pass data through iframe you will need to encode all html tags
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);

?>

Чтобы уточнить, я не после кормления ложкой, но я изо всех сил пытаюсь понять, с чего начать, и посмотреть, как я нахожусь на крутой кривой обучения, я на самом деле не хочу, чтобы ошибиться дорожка. Я мог бы превратить это в процедурный код, но я думаю, что это хорошая возможность для правильного изучения ООП.

Любая помощь очень ценится.

Дан

1 Ответ

2 голосов
/ 30 декабря 2011

Я бы попробовал расширить класс qqFileUploader. Итак, в коде псевдо:

class myClass extends qqFileUploader{

    function handleUpload(){

    }

}

Затем используйте эту функцию handleUpload, чтобы переопределить то, что в данный момент выполняется в этой функции (то есть изменение размера, создание водяных знаков и т. Д.).

ОБНОВЛЕНИЕ: Когда я присматривался к вопросу, мне пришло в голову, что вы можете не возражать против редактирования исходного кода. Я привык стараться не взламывать ядро ​​(используя joomla, wordpress и т. Д.).

Для того, что вы хотите сделать (перехватить файл перед его сохранением), вы захотите вставить свой код в функцию handleUpload между оператором if(!$replaceOldFile) и оператором if ($this->file->save($uploadDirectory . $filename . '.' . $ext)).

Переменная $this->file - это файл, который вы хотите редактировать. Это файл, над которым вы хотите поработать. Вы можете создавать свои собственные пользовательские функции, если хотите, просто добавив функцию в класс qqFileUploader, а затем вызвав ее с помощью $this->yourFunction().

Надеюсь, это поможет вам. Если у вас есть еще вопросы, я постараюсь на них ответить.

ВТОРОЕ ОБНОВЛЕНИЕ: Вот пример того, как вы можете манипулировать данными перед их сохранением. Я просто использовал превращение изображения в оттенки серого в качестве примера, но вы можете делать все что угодно. Этот код должен быть помещен там, где я упоминал ранее, между 2 if операторами.

$image = 'uploads/'.$this->file->getName();

    $im = imagecreatefrompng($image);
    if($im && imagefilter($im, IMG_FILTER_GRAYSCALE)){
        echo 'Image converted to grayscale.';
        imagepng($im, $image);
    }else{
        echo 'Conversion to grayscale failed.';
    }
    imagedestroy($im);

Тогда вы измените это:

if ($this->file->save($uploadDirectory . $filename . '.' . $ext))

на это:

if ($this->file->save($uploadDirectory . $im))

Я только что проверил это, так что я знаю, что это будет работать для вас. Кроме того, я использовал png вместо jpeg, но это только потому, что у меня png валяется:)

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