数据库:文件附件

Introduction

Winter CMS 根据您的需要提供了几种不同的文件管理方式。文件附件是存储在文件系统上的文件,并具有与之关联的数据库记录,以便简化将它们连接到其他数据库记录的过程。

当使用System\Models\File 模型,您可以配置用于存储和检索该模型管理的文件的磁盘和路径,方法是修改storage.uploads 设置在config/cms.php 文件.

文件附件

模型可以使用多态关系.这$attachOne 或者$attachMany 关系旨在将文件链接到称为“附件”的数据库记录。在几乎所有情况下System\Models\File 模型用于保护这种关系,其中对文件的引用作为记录存储在system_files 表并与父模型具有多态关系。

在下面的示例中,模型有一个头像附件模型和许多照片附件模型。

单个文件附件:

public $attachOne = [
    'avatar' => 'System\Models\File'
];

多个文件附件:

public $attachMany = [
    'photos' => 'System\Models\File'
];

NOTE: 如果您的模型表中有一列与附件关系同名,它将不起作用。附件和 FileUpload FormWidget 使用关系工作,因此如果表本身中存在具有相同名称的列,则会导致问题。

受保护的附件被上传到文件上传磁盘的uploads/protected 无法从 Web 直接访问的目录。受保护的文件附件是通过设置public 争论false:

public $attachOne = [
    'avatar' => ['System\Models\File', 'public' => false]
];

创建新附件

对于单数附加关系 ($attachOne),您可以通过模型关系直接创建附件,方法是使用Input::file 方法,它从输入上传中读取文件数据。

$model->avatar = Input::file('file_input');

您也可以将字符串传递给data 包含本地文件绝对路径的属性。

$model->avatar = '/path/to/somefile.jpg';

有时创建一个File 直接来自(原始)数据的实例:

$file = (new System\Models\File)->fromData('Some content', 'sometext.txt');

对于多个附加关系 ($attachMany), 你可以使用create 关系上的方法,注意文件对象关联到data 属性。如果您愿意,这种方法也可以用于单一关系。

$model->avatar()->create(['data' => Input::file('file_input')]);

或者,您可以先准备一个文件模型,然后再手动关联关系。注意is_public 必须使用此方法显式设置属性。

$file = new System\Models\File;
$file->data = Input::file('file_input');
$file->is_public = true;
$file->save();

$model->avatar()->add($file);

您还可以从 URL 添加文件。要使用此方法,您需要安装 cURL PHP 扩展。

$file = new System\Models\File;
$file->fromUrl('https://example.com/uploads/public/path/to/avatar.jpg');

$user->avatar()->add($file);

有时您可能需要更改文件名。您可以使用第二个方法参数来执行此操作。

    $file->fromUrl('https://example.com/uploads/public/path/to/avatar.jpg', 'somefilename.jpg');

查看附件

getPath 方法返回上传的公共文件的完整 URL。下面的代码会打印类似example.com/uploads/public/path/to/avatar.jpg

echo $model->avatar->getPath();

返回多个附件文件路径:

foreach ($model->photos as $photo) {
    echo $photo->getPath();
}

getLocalPath 方法将返回本地文件系统中上传文件的绝对路径。

echo $model->avatar->getLocalPath();

要直接输出文件内容,请使用output 方法,这将包括下载文件所需的标头:

echo $model->avatar->output();

您可以使用getThumb 方法。该方法采用 3 个参数 - 图像宽度、图像高度和选项参数。阅读有关这些参数的更多信息图片大小调整 页。

使用示例

本节展示了模型附件功能的完整使用示例——从定义模型中的关系到在页面上显示上传的图像。

在您的模型中定义与System\Models\File 类,例如:

class Post extends Model
{
    public $attachOne = [
        'featured_image' => 'System\Models\File'
    ];
}

构建用于上传文件的表单:

<?= Form::open(['files' => true]) ?>

    <input name="example_file" type="file">

    <button type="submit">Upload File</button>

<?= Form::close() ?>

在服务器上处理上传的文件并将其附加到模型:

// Find the Blog Post model
$post = Post::find(1);

// Save the featured image of the Blog Post model
if (Input::hasFile('example_file')) {
    $post->featured_image = Input::file('example_file');
}

或者,您可以使用延迟绑定 推迟关系:

// Find the Blog Post model
$post = Post::find(1);

// Look for the postback data 'example_file' in the HTML form above
$fileFromPost = Input::file('example_file');

// If it exists, save it as the featured image with a deferred session key
if ($fileFromPost) {
    $post->featured_image()->create(['data' => $fileFromPost], $sessionKey);
}

在页面上显示上传的文件:

// Find the Blog Post model again
$post = Post::find(1);

// Look for the featured image address, otherwise use a default one
if ($post->featured_image) {
    $featuredImage = $post->featured_image->getPath();
}
else {
    $featuredImage = 'http://placehold.it/220x300';
}

<img src="<?= $featuredImage ?>" alt="Featured Image">

如果需要访问文件的所有者,可以使用attachment 的财产File 模型:

public $morphTo = [
    'attachment' => []
];

Example:

$user = $file->attachment;

欲了解更多信息,请阅读多态关系

验证示例

下面的例子使用数组验证 验证$attachMany 关系。

use Winter\Storm\Database\Traits\Validation;
use System\Models\File;
use Model;

class Gallery extends Model
{
    use Validation;

    public $attachMany = [
        'photos' => File::class
    ];

    public $rules = [
        'photos'   => 'required',
        'photos.*' => 'image|max:1000|dimensions:min_width=100,min_height=100'
    ];

    /* some other code */
}

有关的更多信息attribute.* 上面使用的语法,请参见验证数组.

豫ICP备18041297号-2