szajbus / uploadpack
CakePHP中处理文件上传的简单方式
Requires
- cakephp/cakephp: >=1.2
Requires (Dev)
- cakephp/cakephp-codesniffer: dev-master
- phpunit/phpunit: *
This package is not auto-updated.
Last update: 2024-09-28 18:42:18 UTC
README
UploadPack 是一个插件,它使 CakePHP 中的文件上传尽可能简单。它几乎无需配置即可工作,但如果您需要更多灵活性,则可以轻松覆盖默认设置。
包含内容
UploadBehavior
将其附加到模型,它将检测任何上传的文件并将其保存到磁盘。它甚至可以自动生成上传图像的缩略图。
UploadHelper
在视图中使用它以显示上传的图像或文件的链接。
安装
- 下载此内容:http://github.com/szajbus/uploadpack/zipball/master
- 解压下载内容。
- 将生成的文件夹复制到 app/plugins
- 将您刚刚复制的文件夹重命名为 upload_pack
使用方法
查看示例。
场景:让用户上传他们的头像,并以两种风格显示它们 - 原始尺寸和缩略图。
解决方案
我们需要一个包含 avatar_file_name
字段的 User
模型。
CREATE table users (
id int(10) unsigned NOT NULL auto_increment,
login varchar(20) NOT NULL,
avatar_file_name varchar(255)
);
将 UploadBehavior
附加到 User
模型,并设置它来处理头像。
<?php
class User extends AppModel {
var $name = 'User';
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'styles' => array(
'thumb' => '80x80'
)
)
)
);
}
?>
这就是我们对模型需要做的全部。我们定义了一个名为 'thumb' 的缩略图样式,这意味着将生成大小为 80x80 像素的缩略图并将其与原始图像一起保存到磁盘。
我们没有修改任何其他配置设置,因此文件将保存为 webroot/upload/:model/:id/:basename_:style.:extension
(在运行时用适当的键替换)
请确保 webroot/upload/users
文件夹可写。
现在让我们上传一个文件。我们需要向标准“创建用户”表单中添加一个文件字段。您的表单必须具有正确的 enctype 属性以支持文件上传,例如 $form->create('Users', array('type' => 'file'));
。注意,我们在这里省略了字段的 _file_name
后缀。
<?php echo $form->file('User.avatar') ?>
最后要做的事情是在控制器中处理表单提交。
<?php
class UsersController extends AppController {
var $name = 'Users';
var $uses = array('User');
var $helpers = array('Form', 'UploadPack.Upload');
function create() {
if (!empty($this->data)) {
$this->User->create($this->data);
if ($this->User->save()) {
$this->redirect('/users/show/'.$this->User->id);
}
}
}
function show($id) {
$this->set('user', $this->User->findById($id));
}
}
?>
让我们创建 users/show.ctp
视图以查看结果。请注意,我们已经将 UploadHelper 包含在控制器中的 $helpers。
That would be the original file:
<?php echo $this->Upload->uploadImage($user, 'User.avatar') ?>
And now it's thumbnail:
<?php echo $this->Upload->uploadImage($user, 'User.avatar', array('style' => 'thumb')) ?>
这就是如何使用上传的文件创建新记录。更新现有记录将删除附加到其上的文件。
还能有多简单吗?可能不会。还有更多要提供吗?是的。
高级配置
您可以验证上传的文件
UploadBehavior
提供了一些验证规则,您可以将它们与标准的 CakePHP 验证机制一起使用。
验证附件的大小
var $validate = array(
'avatar' => array(
'maxSize' => array(
'rule' => array('attachmentMaxSize', 1048576),
'message' => 'Avatar can\'t be larger than 1MB'
),
'minSize' => array(
'rule' => array('attachmentMinSize', 1024),
'message' => 'Avatar can\'t be smaller than 1KB'
)
)
);
验证附件的内容类型
var $validate = array(
'avatar' => array(
'image1 => array(
'rule' => array('attachmentContentType', 'image/jpeg'),
'message' => 'Only jpegs please'
),
'image2' => array(
'rule' => array('attachmentContentType', array('image/jpeg', 'image/gif')),
'message' => 'Only jpegs or gifs please'
),
'image3' => array(
'rule' => array('attachmentContentType', array('document/pdf', '/^image\/.+/')),
'message' => 'Only pdfs or images please'
)
)
);
验证附件的存在
var $validate = array(
'avatar' => array(
'rule' => array('attachmentPresence'),
'message' => 'Avatar is required'
)
);
验证图像大小
var $validate = array(
'avatar' => array(
'minWidth' => array(
'rule' => array('minWidth', '100'),
'message' => 'Photo must be at least 100 pixels wide'
),
'maxWidth' => array(
'rule' => array('maxWidth', '600'),
'message' => 'Photo can\'t be over 600 pixels wide'
),
'minHeight' => array(
'rule' => array('minHeight', '100'),
'message' => 'Photo must be at least 100 pixels wide'
),
'maxHeight' => array(
'rule' => array('maxHeight', '600'),
'message' => 'Photo can\'t be over 600 pixels wide'
)
)
);
如果您正在编辑已经附加了头像的记录,并且没有提供新的头像,则记录将是有效的。
验证 PHP 上传错误
PHP:错误消息解释 - 手册 (https://php.ac.cn/manual/features.file-upload.errors.php)
var $validate = array(
'avatar' => array(
'checkIniSizeError' => array(
'rule' => array('phpUploadError', UPLOAD_ERR_INI_SIZE),
'message' => 'The uploaded file exceeds the upload_max_filesize directive in php.ini'
),
'checkSizesError' => array(
'rule' => array('phpUploadError', array(UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE)),
'message' => 'The uploaded file exceeds the upload_max_filesize directive in php.ini or MAX_FILE_SIZE directive that was specified in the HTML form'
),
'checkAllError' => array(
'rule' => array('phpUploadError'),
'message' => 'Can\'t upload'
)
)
);
验证选项
您可以将附加选项传递给验证规则
- allowEmpty – 如果设置为 false,则文件不存在时会导致验证失败。此选项对于 attachmentPresence 规则不可用。
以下示例返回 true,如果没有上传文件或 jpeg。
var $validate = array(
'avatar' => array(
'rule' => array('attachmentContentType', 'image/jpeg'),
'message' => 'Only jpegs please',
'allowEmpty' => true
)
);
您可以将文件保存的位置更改
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'path' => 'your/new/path'
)
)
);
路径字符串可以包含特殊::keys
,在运行时用适当的值替换。以下列出了可用的 :keys
和它们的替换值。
- :app – 应用程序目录的路径
- :webroot – 应用程序 webroot 目录的路径
- :model – 使用Inflector::tableize方法转换的模型表名(例如User模型将是'users')
- :id – 记录的ID
- :basename – 上传文件原始名称的基本名称(例如photo.jpg的将是'photo')
- :extension – 上传文件原始名称的扩展名(例如photo.jpg的将是'jpg')
- :style – 缩略图样式的名称
- :attachment – 附件的复数名称(例如'avatars')
- :hash – 原始文件名加Security.salt的md5散列
路径的默认值为 :webroot/upload/:model/:id/:basename_:style.:extension
。
您可以在显示或链接到上传文件时更改辅助程序指向的URL
此设置接受上述所有:keys,其默认值取决于路径设置。对于默认路径,它将是默认值 /upload/:model/:id/:basename_:style.:extension
。
虽然您可能不会经常更改它,但。
如果上传的文件丢失,您可以将其指向默认URL
如果您将上传头像仅作为用户的选择,那么如果您用户没有上传图片,您可能希望显示一些默认图片。
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'default_url' => 'path/to/default/image'
)
)
);
此设置接受上述所有 :keys
,但默认情况下未设置,即使文件不存在,也会返回通常的URL。
您可以选择自动缩小宽度大于验证中指定的 maxWidth
的图像
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'resizeToMaxWidth' => true
)
)
);
JPEG 质量
可以使用 quality
设置来设置jpeg质量。
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'quality' => 95
)
)
);
Alpha通道(仅限 PNG,GIF)
PNG和GIF可以使用 alpha
设置使用alpha通道。
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'alpha' => true
)
)
);
您可以选择另一个字段作为外部URL
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'urlField' => 'gravatar'
)
)
);
这样,用户可以粘贴URL或从其文件系统中选择文件。该URL将模仿常规上传,因此它仍然会进行验证和调整大小。
删除字段附加的文件
$model->data['avatar'] = null;
$model->save();
关于样式的更多信息
样式是为原始图像生成缩略图的定义。您可以定义任意多个。
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(
'styles' => array(
'big' => '200x200',
'small' => '120x120',
'thumb' => '80x80'
)
)
)
);
请确保在路径设置中包含 :style
键以区分文件名。原始文件也会保存,其 :style
值为'original',因此您不需要自己定义它。
如果您想上传非图像文件,则可以完全不定义样式。为zip或pdf文件生成缩略图没有太多意义。
您可以为样式指定以下任何一种调整大小模式
- 100×80 – 调整大小以最适合这些尺寸,如果原始宽高比不同,则裁剪重叠边缘
- [100×80] – 调整大小以适合这些尺寸,如果原始宽高比不同,则添加白色条纹(Michał的原始调整大小方法)
- 100w – 维持原始宽高比,调整大小为100像素宽
- 80h – 维持原始宽高比,调整大小为80像素高
- 80l – 维持原始宽高比,调整大小使得最长边为80像素
关于数据库表结构的更多信息
您需要添加到模型表中的唯一数据库字段是 [field]_file_name
。用选择的名称替换 [field]
(例如,用avatar替换)。
您可以添加两个字段,这两个字段是可选的:[field]_content_type
和 [field]_file_size
。如果它们存在,它们将分别填充上传文件的MIME类型和大小(以字节为单位)。
模型可以同时上传多个文件。例如,在数据库表中定义两个字段:avatar_file_name
和 logo_file_name
。设置行为
var $actsAs = array(
'UploadPack.Upload' => array(
'avatar' => array(),
'logo' => array()
)
)
);
使用辅助程序
您可以使用UploadHelper的两种方法
UploadHelper::uploadUrl($data, $field, $options = array())
返回上传文件的URL
- $data – 数据库中的记录(这里将是
$user
) - $field – 字段名称,例如这样
Modelname.fieldname
(这里将是User.avatar
) - $options – URL 选项
- ‘style’ – 缩略图的样式名称
- ‘urlize’ – 如果为 true,则返回的 URL 用
$html->url()
包装
UploadHelper::uploadImage($data, $field, $options = array(), $htmlOptions = array())
返回指向上传文件的图像标签。
- $data – 数据库中的记录(这里将是
$user
) - $field – 字段名称,例如这样
Modelname.fieldname
(这里将是User.avatar
) - $options – URL 选项
- ‘style’ – 缩略图的样式名称
- ‘urlize’ – 如果为 true,则返回的 URL 用
$html->url()
包装
- $htmlOptions – 传递给
$html->image()
的 HTML 属性数组
假设您已从数据库中读取用户,并在视图中可用 $user
变量。
<?php echo $this->Upload->uploadImage($user, 'User.avatar', array('style' => 'thumb')); ?>
当您从数据库获取用户时,通常会得到
$user = array(
'User' => array(
'id' => 1,
'avatar_file_name' => 'photo.jpg'
)
);
但当用户作为与另一个模型关联的多个用户之一被获取时,它可能类似于
$data = array(
'User' => array(
0 => array(
'id' => 1,
'avatar_file_name' => 'photo.jpg'
),
1 => array(
'id' => 2,
'avatar_file_name' => 'photo2.jpg'
)
)
);
然后您应该这样做
<?php echo $this->Upload->uploadImage($data['User'][0], 'User.avatar', array('style' => 'thumb')) ?>
辅助器足够智能,可以找出您传递给它的数据结构。
要求
UploadPack 是与 CakePHP 1.2 RC3 开发的,因此不能保证与先前版本兼容。如果您计划生成图像缩略图,则需要 GD 库。它至少与 2.0.34 版本兼容,早期版本也可能兼容。
未来的计划
UploadPack 仍然有一些缺失的功能,以下是即将添加的功能
- 文件名规范化
更遥远的未来的计划
- 测试覆盖率
- 允许上传到 S3
- 提供一种方法来重新生成所有缩略图,如果您后来决定要不同的缩略图大小或更多样式,这很有帮助
如果您想帮助实现这些功能,请随时提交您的补丁。
版权
版权所有 © 2008 Michał Szajbe (http://codetunes.com),根据 MIT 许可证发布。
joe bartlett 的 (http://jdbartlett.com) 调整不受版权保护。自由运行,小小的调整!