CakePHP Media Plugin - Загрузить папку - PullRequest
1 голос
/ 03 марта 2011

Я использую Media Plugin (http://www.ohloh.net/p/cakephp-media).

Я хочу определить пользовательскую папку для всех загрузок. Я немного запутался, когда это нужно сделать. Это структура папок, которую я хочу достичь

webroot/media/image/original (for the original file storage)
webroot/media/image/large (for the large image filter)
webroot/media/image/medium (for the medium image filter)
webroot/media/image/small (for the small image filter)

также я хочу использовать случайное имя, которое я хочу сгенерировать, используя следующий скрипт.

//UUID generator
function _imgName() {
    return time() . substr(md5(microtime()), 0, 12);
}

1 Ответ

2 голосов
/ 03 марта 2011

Во-первых, воспользовавшись этим плагином, я бы порекомендовал рассмотреть структуру каталогов по умолчанию, чтобы упростить ваше приложение.Вы не хотите редактировать плагин напрямую, так как это сделает обновление более болезненным ...

# /app/webroot/media/transfer/img/slug.ext (for the original file storage)
# /app/webroot/media/filter/l/img/slug.ext (for the large image filter)
# /app/webroot/media/filter/m/img/slug.ext (for the medium image filter)
# /app/webroot/media/filter/s/img/slug.ext (for the small image filter)

Однако файл конфигурации медиа-плагина находится в /app/plugins/media/config/core.php и содержит некоторые константы, которые вы можете переопределить для всего приложения, определив их в /app/config/bootstrap.php first .Чтобы получить формат, похожий на тот, который вы хотите, вы можете определить следующие переменные:

define('MEDIA_TRANSFER', WWW_ROOT . 'media' . DS . 'original' . DS);
define('MEDIA_FILTER', WWW_ROOT . 'media' . DS);
define('MEDIA_TRANSFER_URL', 'media/original/');
define('MEDIA_FILTER_URL', 'media/');

# /app/webroot/media/original/img/slug.ext (for the original file storage)
# /app/webroot/media/l/img/slug.ext (for the large image filter)
# /app/webroot/media/m/img/slug.ext (for the medium image filter)
# /app/webroot/media/s/img/slug.ext (for the small image filter)

(Примечание: вы также можете установить вышеупомянутые пути для каждой модели, передав правильные параметры конфигурации, когдадобавив поведение к вашим моделям.)

Вы также можете переопределить имена используемых фильтров изображений, чтобы приблизиться к вашей цели.Вам нужно сделать это снова в /app/config/bootstrap.php, но после вы загрузили конфигурацию плагина Media:

require APP . 'plugins' . DS . 'media' . DS . 'config' . DS . 'core.php';
Configure::write('Media.filter.image', array(
    'small' => array('convert' => 'image/png', 'zoomCrop' => array(100, 100)),
    'medium' => array('convert' => 'image/png', 'fitCrop' => array(300, 300)),
    'large' => array('convert' => 'image/png', 'fit' => array(600, 440)),
));

# /app/webroot/media/original/img/slug.ext (for the original file storage)
# /app/webroot/media/large/img/slug.ext (for the large image filter)
# /app/webroot/media/medium/img/slug.ext (for the medium image filter)
# /app/webroot/media/small/img/slug.ext (for the small image filter)

Если вы читаете документацию по методу Media.TransferBehavior::transferTo(), вы увидите, что вы можете настроить последнюю часть пути (т. Е. img/slug.ext), переопределив этот метод в своей модели (например, MyModel::transferTo()).Что-то вроде этого сделало бы вас еще ближе:

class MyModel extends AppModel {
    public function transferTo($via, $from) {
        extract($from);
        $mime = Mime_Type::guessName($mimeType ? $mimeType : $file);
        $name = $this->_imgName();
        $path  = $mime . DS . $name
        $path .= !empty($extension) ? '.' . strtolower($extension) : null;
        return $path;
    }
}

# /app/webroot/media/original/image/129916996632c787226a0b.ext (for the original file storage)
# /app/webroot/media/large/image/129916998392a3570a1828.ext (for the large image filter)
# /app/webroot/media/medium/image/12991699891c7625bebedb.ext (for the medium image filter)
# /app/webroot/media/small/image/12991699938ab22d80cfc6.ext (for the small image filter)

Хотя это не совсем то, что вы искали (/large/image/ против /image/large/), это примерно так же далеко, как вы можете пойти без переопределения больших порцийплагин.Это связано с тем, что путь обрабатывается как две части (например, /media/large/ и image/129916998392a3570a1828.ext), которые добавляются вместе позже.Вы можете увидеть операцию добавления в методе Media.TransferBehavior::_prepare() и в методе Media.GeneratorBehavior::make() .Вам нужно будет либо расширить плагин и продублировать эти методы (с изменениями) в коде приложения, либо взломать эти две строки напрямую, чтобы получить желаемый результат!

...