## HTTP POST 文件上傳
PHP 使用超全局變量 $_FILES 接收 HTTP POST 方式提交的文件。
* `$_FILES['file']['name']` 客戶端機器文件的原名稱。
* `$_FILES['file']['type']` 文件的 MIME 類型
* `$_FILES['file']['size']` 已上傳文件的大小,單位為字節。
* `$_FILES['file']['tmp_name']` 文件被上傳后在服務端儲存的臨時文件名。
* `$_FILES['file']['error']` 和該文件上傳相關的錯誤代碼。
系統返回的錯誤碼詳解:
| 錯誤碼 | 說明 |
| --- | --- |
| UPLOAD_ERR_OK(0)| 文件上傳成功 |
| UPLOAD_ERR_INI_SIZE(1)| 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值 |
| UPLOAD_ERR_FORM_SIZE(2)| 上傳文件的大小超過了 表單中 MAX_FILE_SIZE 選項指定的值 |
| UPLOAD_ERR_PARTIAL(3)| 只有部分文件被上傳 |
| UPLOAD_ERR_NO_FILE(4)| 文件沒有被上傳 |
| UPLOAD_ERR_NO_TMP_DIR(6)| 找不到臨時文件夾 |
| UPLOAD_ERR_CANT_WRITE(7)| 文件寫入失敗 |
上傳文件表單的基本結構:
```
<form action="file.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input type="file" name="file">
<input type="submit" value="submit">
</form>
```
注意事項:
* form 表單中的參數 method 必須為 POST
* enctype 須為 multipart/form-data
* MAX_FILE_SIZE 隱藏字段必須放在文件輸入字段之前
上傳示例:
```
<?php
$form = <<<EOT
<form action="test.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<p><input type="file" name="file"></p>
<p>只允許 gif,jpg,png 格式文件,大小不超過 2M</p>
<p><input type="submit" name="submit" value="submit"></p>
</form>
EOT;
if (isset($_POST['submit'])) {
if ($_FILES['file']['error'] > 0) {
exit('上傳文件出錯');
}
$MAX_FILE_SIZE = 2000000;
if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {
exit('文件超出指定大小');
}
$allowExts = array('jpg', 'gif', 'png');
$parts = explode('.', $_FILES['file']['name']);
$ext = array_pop($parts);
if (!in_array($ext, $allowExts)) {
exit('文件后綴名不符');
}
$mimeTypes = array(
"image/jpg",
"image/jpeg",
"image/gif",
"image/png",
);
if (!in_array($_FILES['file']['type'], $mimeTypes)) {
exit('文件格式不正確,請檢查');
}
$tmpName = $_FILES['file']['tmp_name'];
$targetName = '/home/koogua/tmp/' . uniqid() . '.' . $ext;
if (!is_uploaded_file($tmpName)) {
echo '不是上傳文件';
}
if (move_uploaded_file($tmpName, $targetName)) {
echo '上傳成功';
} else {
echo '上傳失敗';
}
} else {
echo $form;
}
?>
```
php.ini 上傳配置項
| 配置項 | 功能說明 |
| --- | --- |
| file_uploads | on 為開啟文件上傳功能,off 為關閉 |
| post_max_size | 系統允許的 POST 傳參的最大值 |
| upload_max_filesize | 系統允許的上傳文件的最大值 |
| memory_limit | 內存使用限制 |
建議配置: file_size < upload_max_filesize < post_max_size < memory_limit
- 基本語法
- PHP標記
- 指令分隔符
- 從HTML中分離
- 注釋
- 數據類型
- 布爾值
- 整數
- 浮點數
- 字符串
- 數組
- 對象
- 資源
- 空值
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 常量
- 常量語法
- 魔術常量
- 運算符
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 遞增與遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if條件結構
- switch條件結構
- while循環結構
- do-while循環結構
- for循環結構
- foreach循環結構
- 包含文件
- 函數
- 自定義函數
- 可變函數
- 匿名函數
- 遞歸函數
- 類與對象
- 基本概念
- 屬性
- 方法
- 類常量
- 構造函數和析構函數
- 訪問控制
- 繼承
- 抽象類
- 接口
- Trait
- 重載
- 對象遍歷
- 魔術方法
- Final關鍵字
- 命名空間
- 自動加載
- 錯誤處理
- 錯誤顯示
- 錯誤日志
- 錯誤報告
- 自定義錯誤處理
- 異常處理
- 異常處理機制
- 擴展異常處理類
- 字符操作
- 數組操作
- 時間操作
- 表單操作
- GET提交
- POST提交
- 文件上傳
- 會話控制
- COOKIE操作
- SESSION操作
- 文件操作
- 文件屬性
- 讀取文件
- 寫入文件
- 文件管理
- 文件鎖
- 目錄處理
- 路徑處理
- 網絡操作
- HTTP協議
- Socket操作
- CURL操作
- PDO操作
- 介紹
- 連接管理
- 預處理語句
- 事務處理
- 錯誤處理
- 圖像操作
- 正則表達式
- 標準推薦
- 包管理器
- 設計模式
- 常用算法
- 安全防御
- XSS防御
- CSRF防御