# 文件附件
### 文件附件
模型可以使用[多態關系](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 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖