CakePHP媒体插件 - 上传文件夹

时间:2011-03-03 06:42:22

标签: cakephp plugins cakephp-1.3

我使用的是Media Plugin(http://www.ohloh.net/p/cakephp-media)。

我想为所有的uplaods定义自定义文件夹。我有点困惑,必须要做的事情。 这是我想要实现的文件夹结构

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)

我还想使用以下sript生成的随机名称。

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

1 个答案:

答案 0 :(得分:2)

首先,在使用此插件后,我建议考虑使用默认目录结构来保持您的应用程序更简单。您不希望直接编辑插件,因为它会使升级更加痛苦......

# /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 中首先定义它们来覆盖整个应用程序范围< / em>的。要获得与您想要的格式有些类似的格式,您可以定义以下变量:

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中执行此操作,但之后加载了媒体插件配置:

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() method的文档,您将看到您可以通过在模型中重新实现此方法来自定义路径的后半部分(即img/slug.ext)(例如{{1} }})。这样的事情会让你更接近:

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) vs /large/image/),但这可以在不重新实现插件的大部分内容的情况下实现。这是因为路径被视为两个部分(例如/image/large//media/large/),后来会附加在一起。您可以在Media.TransferBehavior::_prepare() methodMedia.GeneratorBehavior::make() method中看到正在进行的追加操作。您需要扩展插件并在应用程序代码中复制这些方法(带有更改),或者直接破解这两行以获得所需的输出!