szajbus/uploadpack

CakePHP中处理文件上传的简单方式

安装: 374

依赖: 0

建议者: 0

安全: 0

星标: 101

关注者: 13

分支: 35

开放问题: 15

类型:cakephp-plugin

dev-main 2016-06-27 12:04 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:42:18 UTC


README

UploadPack 是一个插件,它使 CakePHP 中的文件上传尽可能简单。它几乎无需配置即可工作,但如果您需要更多灵活性,则可以轻松覆盖默认设置。

包含内容

UploadBehavior

将其附加到模型,它将检测任何上传的文件并将其保存到磁盘。它甚至可以自动生成上传图像的缩略图。

UploadHelper

在视图中使用它以显示上传的图像或文件的链接。

安装

  1. 下载此内容:http://github.com/szajbus/uploadpack/zipball/master
  2. 解压下载内容。
  3. 将生成的文件夹复制到 app/plugins
  4. 将您刚刚复制的文件夹重命名为 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通道(仅限 PNGGIF

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_namelogo_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) 调整不受版权保护。自由运行,小小的调整!