## 上傳文件
> 內置的上傳只是上傳到本地服務器,上傳到遠程或者第三方平臺的話需要安裝額外的擴展。
假設表單代碼如下:
~~~
<form action="/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br>
<input type="submit" value="上傳" />
</form>
~~~
然后在控制器中添加如下的代碼:
~~~
public function upload(){
// 獲取表單上傳文件 例如上傳了001.jpg
$file = request()->file('image');
// 上傳到本地服務器
$savename = \think\facade\Filesystem::putFile( 'topic', $file);
}
~~~
`$file`變量是一個`\think\File`對象,你可以獲取相關的文件信息,支持使用`SplFileObject`類的屬性和方法。
## 上傳規則
默認情況下是上傳到本地服務器,會在`runtime/storage`目錄下面生成以當前日期為子目錄,以微秒時間的`md5`編碼為文件名的文件,例如上面生成的文件名可能是:
~~~
runtime/storage/topic/20160510/42a79759f284b767dfcb2a0197904287.jpg
~~~
如果是多應用的話,上傳根目錄默認是`runtime/index/storage`,如果你希望上傳的文件是可以直接訪問或者下載的話,可以使用`public`存儲方式。
~~~
$savename = \think\facade\Filesystem::disk('public')->putFile( 'topic', $file);
~~~
你可以在`config/filesystem.php`配置文件中配置上傳根目錄及上傳規則,例如:
~~~
return [
'default' => 'local',
'disks' => [
'local' => [
'type' => 'local',
'root' => app()->getRuntimePath() . 'storage',
],
'public' => [
'type' => 'local',
'root' => app()->getRootPath() . 'public/storage',
'url' => '/storage',
'visibility' => 'public',
],
// 更多的磁盤配置信息
],
];
~~~
我們可以指定上傳文件的命名規則,例如:
~~~
$savename = \think\facade\Filesystem::putFile( 'topic', $file, 'md5');
~~~
最終生成的文件名類似于:
~~~
runtime/storage/topic/72/ef580909368d824e899f77c7c98388.jpg
~~~
系統默認提供了幾種上傳命名規則,包括:
| 規則 | 描述 |
| --- | --- |
| date | 根據日期和微秒數生成 |
| md5 | 對文件使用md5\_file散列生成 |
| sha1 | 對文件使用sha1\_file散列生成 |
> 其中md5和sha1規則會自動以散列值的前兩個字符作為子目錄,后面的散列值作為文件名。
如果需要使用自定義命名規則,可以在`rule`方法中傳入函數或者使用閉包方法,例如:
~~~
$savename = \think\facade\Filesystem::putFile( 'topic', $file,'uniqid');
~~~
如果希望以指定的文件名保存,可調用`putFileAs`方法,例如:
~~~
$savename = \think\facade\Filesystem::putFileAs( 'topic', $file,'abc.jpg');
~~~
## 多文件上傳
如果你使用的是多文件上傳表單,例如:
~~~
<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image[]" /> <br>
<input type="file" name="image[]" /> <br>
<input type="file" name="image[]" /> <br>
<input type="submit" value="上傳" />
</form>
~~~
控制器代碼可以改成:
~~~
public function upload(){
// 獲取表單上傳文件
$files = request()->file('image');
$savename = [];
foreach($files as $file){
$savename[] = \think\facade\Filesystem::putFile( 'topic', $file);
}
}
~~~
## 上傳驗證
支持使用驗證類對上傳文件的驗證,包括文件大小、文件類型和后綴:
~~~
public function upload(){
// 獲取表單上傳文件
$files = request()->file();
try {
validate(['image'=>'filesize:10240|fileExt:jpg|image:200,200,jpg'])
->check($files);
$savename = [];
foreach($files as $file) {
$savename[] = \think\facade\Filesystem::putFile( 'topic', $file);
}
} catch (\think\exception\ValidateException $e) {
echo $e->getMessage();
}
}
~~~
| 驗證參數 | 說明 |
| --- | --- |
| fileSize | 上傳文件的最大字節 |
| fileExt | 文件后綴,多個用逗號分割或者數組 |
| fileMime | 文件MIME類型,多個用逗號分割或者數組 |
| image | 驗證圖像文件的尺寸和類型 |
具體用法可以參考驗證器(validate)。
## 獲取文件hash散列值
可以獲取上傳文件的哈希散列值,例如:
~~~
// 獲取表單上傳文件
$file = request()->file('image');
// 獲取上傳文件的hash散列值
echo $file->hash('sha1');
echo $file->hash('md5');
~~~
- 搭建ThinkPHP6的開發環境
- 配置ThinkPHP6
- 必要的基礎知識(basic)
- MVC開發模式
- 控制器(controller)
- 數據庫(database)
- 模型(model)
- 模型關聯(relation)
- 視圖(view)
- Session
- Cookie
- 緩存(cache)
- 上傳(upload)
- 驗證器(validate)
- 驗證碼(captcha)
- 命令行(command)
- 服務器部署(deploy)
- 數據備份(backup)
- 數據同步(synchronization)
- 訂閱服務(subscribe)
- PHP 易混淆知識點
- 助手函數
- MySQL規范
- Redis 規范
- office插件 phpoffice
- 拼音插件 pinyin
- 日期插件 datetime
- 消息插件 amqp
- 產品部署環境的搭建
- PDF 等雜項處理
- 文件上傳
- 常用擴展
- flc/dysms
- 使用示例 ①
- 使用示例 ②
- qiniu/php-sdk
- 簡介
- 使用示例
- 使用示例 2 ②
- liliuwei/thinkphp-jump
- 擴展介紹
- 下載擴展
- 使用方法
- topthink/think-captcha
- 安裝擴展
- 驗證碼顯示
- 更換驗證碼
- 驗證碼校驗
- 驗證碼配置
- 自定義驗證碼
- phpoffice/phpspreadsheet
- 數據寫入表格
- 讀取表格數據
- topthink/think-queue
- 安裝
- 自定義函數
- 任務類
- 帶有日志的任務類