# 文件附件
### 文件附件
模型可以使用[多态关系](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)。
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图