burriko/cake-file-storage

为 CakePHP 提供基本文件存储行为。处理将上传的文件存储在数据库或文件系统中。

v2.0.0 2013-08-10 21:15 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:19:37 UTC


README

CakePHP 2.x 的文件存储插件。有关 CakePHP 1.x 行为,请参阅 cakephp1 分支。

处理将文件附加到模型,并将上传的文件存储在数据库或文件系统中。如果上传到文件系统,将在数据库中存储元数据。

存储在文件系统中的文件将根据文件内容的哈希值存储在目录层次结构中。不使用文件名,因此永远不会冲突。这种层次结构可以缓解存储大量文件时的性能问题。

安装

如果您使用 composer,则只需将以下内容添加到您的 require 块中。

	"burriko/cake-file-storage": "2.1.*@dev"

如果您不使用它,则将此目录的内容克隆/复制到 app/Plugins/CakeFileStorage。

配置

  1. 将以下行添加到您的 app/Config/bootstrap.php。

     CakePlugin::load('CakeFileStorage');
    
  2. 在您的模型中添加

     public $actsAs = array('CakeFileStorage.FileStorage');
    
  3. 您的模型数据库模式需要字段 filename、type 和 size。如果将文件存储在文件系统中,还需要一个名为 hash 的字段,如果存储在数据库中,则需要一个名为 content 的字段。以下是一个示例模式。

     CREATE TABLE `files` (
       `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
       `filename` varchar(100) NOT NULL,
       `type` varchar(100) NOT NULL,
       `size` mediumint(8) unsigned NOT NULL,
       `content` mediumblob NOT NULL,
       `hash` varchar(40) NOT NULL,
       `created` datetime NOT NULL,
       `modified` datetime NOT NULL,
       PRIMARY KEY (`id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

用法

当保存此模型时,如果存在名为 'file' 的表单字段,则将使用行为将其保存为文件。默认情况下,它将保存到应用程序根目录中的 'uploads' 文件夹。可以通过以下方式传递设置来更改默认值。

	public $actsAs = array(
		'CakeFileStorage.FileStorage' => array(
			'storage_type' => 'filesystem',
			'file_path' => '/path/to/files'
			'field_name' => 'my_file'
		)
	);

行为还提供了一条验证消息,用于检查上传的文件没有出现任何问题。可以如下使用。

	public $validate = array(
		'file' => array(
			'rule' => 'checkFileUpload',
			'message' => 'There was a problem uploading your file.'
		)
	);

您可以通过使用 fetchFile() 方法从模型中检索文件,并使用 FileStorage 组件的 downloadFile() 方法将文件作为响应发送。以下是一个将它们组合在一起的示例控制器。

	class DocumentsController extends AppController
	{
		public $components = array('CakeFileStorage.FileStorage');

		public function download($id)
		{
			$document = $this->Document->fetchFile($id);

			return $this->FileStorage->createFileResponse($document);
		}
	}

当删除记录时,如果该文件没有指向其他记录(因为文件是根据其内容哈希存储的,如果为多个记录上传了相同的文件,则它们都会在磁盘上共享相同的文件),则该文件也将从磁盘上删除。