ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 文件附件 ### 文件附件 模型可以使用[多态关系](https://octobercms.com/docs/database/relations#polymorphic-relations)的子集来支持文件附件。该`$attachOne`或`$attachMany`关系是专为一个文件链接到名为“附件”的数据库记录。在几乎所有情况下,`System\Models\File`都使用模型来安全保持这种关系,其中对文件的引用作为记录存储在`system_files`表中,并且与父模型具有多态关系。 在下面的示例中,模型具有单个Avatar附件模型和许多Photo附件模型。 单个文件附件: ~~~ public $attachOne = [ 'avatar' => 'System\Models\File' ]; ~~~ 多个文件附件: ~~~ public $attachMany = [ 'photos' => 'System\Models\File' ]; ~~~ 注意:在以上示例中,使用的密钥名称与文件上载字段名称相同。在模型与`System\Models\File`模型之间创建多态关系时,如果具有与文件上载字段名称同名的列,则可能导致意外结果。 受保护的附件被上载到应用程序的**uploads / protected**目录,该目录不能从Web直接访问。受保护的文件附件是通过将*public*参数设置为来定义的`false`: ~~~ public $attachOne = [ 'avatar' => ['System\Models\File', 'public' => false] ]; ~~~ ### [](https://octobercms.com/docs/database/attachments#creating-attachments)创建新附件 对于奇异的附件关系(`$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 Extension。 ~~~ $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'); ~~~ ### [](https://octobercms.com/docs/database/attachments#viewing-attachments)查看附件 该`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个参数-图像宽度,图像高度和options参数。在“[图像调整大小”](https://octobercms.com/docs/services/image-resizing#resize-parameters)页面上了解有关这些参数的更多信息。 ### [](https://octobercms.com/docs/database/attachments#attachments-usage-example)使用范例 本部分显示了模型附件功能的完整用法示例-从定义模型中的关系到在页面上显示上载的图像。 在模型内部,定义与`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'); } ~~~ 另外,您可以使用[延迟绑定](https://octobercms.com/docs/database/relations#deferred-binding)来延迟关系: ~~~ // 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' => [] ]; ~~~ 例: ~~~ $user = $file->attachment; ~~~ 有关更多信息,请阅读[多态关系](https://octobercms.com/docs/database/relations#polymorphic-relations) ### [](https://octobercms.com/docs/database/attachments#attachments-validation-example)验证示例 下面的示例使用[数组验证](https://octobercms.com/docs/services/validation#validating-arrays)来验证`$attachMany`关系。 ~~~ use October\Rain\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.*`上面使用的语法的更多信息,请参见[验证数组](https://octobercms.com/docs/services/validation#validating-arrays)。