[TOC]
# 文件上傳
### 客戶端上傳設置
* 在B/S程序中文件上傳已經成為一個常用功能。其目的是客戶可以通過瀏覽器(Browser)將文件上傳到服務器(Server)上的指定目錄。
* PHP中文件上傳的基礎知識:
客戶端form表單
服務器端對上傳文件的操作
```
客戶端文件上傳的form表單:
<html>
<head><title>文件上傳</title></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
選擇文件:<input type="file" name="myfile">
<input type="submit" value="上傳文件">
</form>
</body>
</html>
```
注意幾個特征屬性:
* POST方法:
表單最常用的功能,向目標頁面傳遞變量,我們在上傳文件的時候,會在表單中設置相應的屬性,來完成文件的傳遞
* enctype="multipart/form-data"
這樣服務器就會知道,我們要傳遞一個文件,這樣服務器可以知道上載的文件帶有常規的表單信息。
* MAX_FILE_SIZE
此字段必須在文件輸入字段之前,控制最大的傳遞文件的大小(字節)
* 設置瀏覽器文件輸入瀏覽按鈕
```
<input type="file" name="userfile">
```
### 在服務器端通過PHP處理上傳
上傳文件的接收和處理是通過PHP腳本來處理的,具體需要通過以下三個方面信息:
* 設置PHP配置文件中的指令:用于精細地調節PHP的文件上傳功能。
###### PHP配置文件中與文件上傳有關的選項:
| 指令名 | 默認值 | 功能描述 |
| --- | --- | --- |
| file_uploads | ON | 是否開啟文件上傳 |
| upload_max_filesize | 2M | 限制PHP處理上傳文件大小的最大值,此值必須小于post_max_size |
| post_max_size | 8M | 限制通過POST方法可以接受信息的最大值,也就是整個POST請求的提交值。此值必須大于upload_max_filesize |
| upload_tmp_dir | NULL | 上傳文件存放的臨時路徑,可以是絕對路徑。默認NULL則使用系統的臨時目錄 |
* $_FILES多維數組:用于存儲各種與上傳文件有關的信息,其他數據還是使用$_POST獲取。
###### 超級全局數組`$_FILES`
* $_FILES["myfile"]["name"]中的值是:
客戶端文件系統的文件的名稱
* $_FILES["myfile"]["type"]中的值是:
客戶端傳遞的文件的類型
* $_FILES["myfile"]["size"]中的值是:
文件的字節的大小
* $_FILES["myfile"]["tmp_name"]中的值是:
文件被上傳后在服務器存儲的臨時全路徑
* $_FILES["myfile"]["error"]中的值是:
文件上傳的錯誤代碼-php 4.2以后增加的功能
###### 存儲在`$_FILES["myfile"]["error"]`中的值
伴隨文件上傳時產生的錯誤信息代碼是在PHP4.2.0版本中引入的,具體如下:
* 值為0:表示沒有發生任何錯誤。對應常量的值 `UPLOAD_ERR_OK`
* 值為1:表示上傳文件的大小超出了約定值。文件大小的最大值是在PHP配置文件中指定的,該指令是:upload_max_filesize。對應常量的值 `UPLOAD_ERR_INI_SIZE`
* 值為2:表示上傳文件大小超出了HTML表單隱藏域屬性的MAX_FILE_SIZE元素所指定的最大值。對應常量的值 `UPLOAD_ERR_FORM_SIZE`
* 值為3:表示文件只被部分上傳。對應常量的值 `UPLOAD_ERR_PARTIAL`
* 值為4:表示沒有上傳任何文件。對應常量的值 `UPLOAD_ERR_NO_FILE`
* 值為6:表示找不到臨時文件夾。PHP 4.3.10 和 PHP 5.0.3 引進。對應常量的值 `UPLOAD_ERR_NO_TMP_DIR`
* 值為7:表示文件寫入失敗。PHP 5.1.0 引進。對應常量的值 `UPLOAD_ERR_CANT_WRITE`
常見的數據格式
|文件類型| MIME類型|
| --- | --- |
|圖片文件| image/gif,image/jpg,image/jpeg,image/png,image/x-png|
|純文本和HTML| text/txt,text/plain,text/html|
|二進制文件| application/octet-stream|
|音頻格式| audio/basic|
|視頻格式| video/mpeg|
###### PHP的文件上傳處理函數:用于上傳文件的后續處理。
上傳成功的文件會被放置到服務器端臨時目錄下,文件名是隨機生成的臨時文件名。
> 注意:該文件在程序執行完后將自動被刪除掉。在刪除前可以像本地文件一樣操作。
文件上傳處理函數:
* `is_uploaded_file` —判斷文件是否是通過 HTTP POST 上傳的
```
格式:bool is_uploaded_file ( string $filename )
```
* `move_uploaded_file` — 將上傳的文件移動到新位置
```
格式:bool move_uploaded_file ( string $filename , string $destination )
```
> 注意:如果目標文件已經存在,將會被覆蓋。
### 上傳代碼示例
```
<?php
$allowtype = array("gif", "png", "jpg"); //設置充許上傳的類型為gif, png和jpg
$size = 1000000; //設置充許大小為1M(1000000字節)以內的文件
$path = "./uploads"; //設置上傳后保存文件的路徑
//1. 判斷文件是否可以成功上傳到服務器,$_FILES['myfile']['error'] 為0表示上傳成功
if($_FILES['myfile']['error'] > 0) {
echo '上傳錯誤: ';
switch ($_FILES['myfile']['error']) {
case 1: die('上傳文件大小超出了PHP配置中的約定值:upload_max_filesize');
case 2: die('上傳文件大小超出了表單中的約定值:MAX_FILE_SIZE');
case 3: die('文件只被部分上載');
case 4: die('沒有上傳任何文件');
case 6: die('找不到臨時文件夾');
case 7: die('文件寫入失敗');
default: die('末知錯誤');
}
}
//2. 判斷上傳的文件是否為充許的文件類型,通過文件的后綴名
$hz = array_pop(explode(".", $_FILES['myfile']['name']));
//3.通過判斷文件的后綴方式,來決定文件是否是充許上傳的文件類型
if(!in_array($hz, $allowtype)) {
die("這個后綴是<b>{$hz}</b>,不是充許的文件類型!");
}
//4. 判斷上傳的文件是否為充許大小
if($_FILES['myfile']['size'] > $size ) {
die("超過了充許的<b>{$size}</b>字節大小");
}
//5. 為了系統安全,也為了同名文件不會被覆蓋,上傳后將文件名使用系統定義
$filename = date("YmdHis").rand(100,999).".".$hz;
//6. 判斷是否為上傳文件
if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
if (!move_uploaded_file($_FILES['myfile']['tmp_name'], $path.'/'.$filename)) {
die('問題: 不能將文件移動到指定目錄。');
}
}else{
die("問題: 上傳文件{$_FILES['myfile']['name']}不是一個合法文件: ");
}
//7. 如果文件上傳成功則輸出
echo "文件{$upfile}上傳成功,保存在{$path}中,大小為{$_FILES['myfile']['size']}字節";
?>
```
# 多文件上傳
當需要上傳多個文件的情況,有兩種實現的解決方法:
* 使用不同的表單元素
```
<input type="file" name="file_a">
<input type="file" name="file_b">
<input type="file" name="file_b">
```
* 使用數組格式的表單元素
```
<input type="file" name="file[]">
<input type="file" name="file[]">
<input type="file" name="file[]">
```
# 文件下載
```
<?php
//文件下載練習
$filename="./upload/aa.png";
$basename=pathinfo($filename);
header("Content-Type: image/png"); //指定下載文件類型的
header("Content-Disposition:attachment;filename=". $basename["basename"]);
//指定下載文件的描述信息
header("Content-Length:".filesize($filename)); //指定文件大小的
readfile($filename);//將內容輸出,以便下載。
?>
```
- 前言
- Ⅰ.PHP基礎知識
- 1.PHP基本語法(一)
- 2.PHP基本語法(二)
- 3.流程控制結構
- 4.PHP函數
- 5.數組
- 6.字符串
- 7.PHP正則表達式
- 8.PHP的日期和時間
- 9.GD庫圖像處理
- 10.文件處理系統
- 11.文件上傳和下載
- 12.數據庫之MySQL(概述)
- Ⅱ.ThinkPHP5入門實踐
- 一、先看到頁面
- 1.1只展示頁面
- 1.2給視圖傳遞數據
- 1.3使用公共模板
- 1.4使用模板布局
- 二、簡單的數據庫操作
- (1)查
- (2)增
- (3)改
- (4)刪
- (5)鏈式操作
- 三、初級-階段性綜合應用
- (1)注冊
- (2)登錄
- 四、各種基本操作
- 1.操作Session
- 2.操作Cookie
- 3.文件上傳
- 五、富文本編輯器
- 集成wangEditor
- 集成UEditor
- 六、驗證碼
- 圖片驗證碼
- Ⅲ.常用類庫的使用
- 一、PHPExcel表格導入
- 二、PHPExcel表格導出
- 三、阿里大于短信驗證碼
- 四、時間戳操作Time
- 五、郵件發送
- 六、PHP操作Python
- Ⅳ.實例講解
- 一、病房管理系統
- 寫在前面
- 1.引導頁
- 2.公共模板
- 3.登錄
- 4.功能引導頁集合
- 5.修改密碼
- 6.員工信息注冊
- 7.員工信息更新
- 8.員工信息刪除
- 9.病人信息注冊
- 10.病人信息更新
- 11.出院手續辦理
- 12.病人信息刪除
- 13.科室信息查詢
- 14.醫護信息查詢
- 15.病房信息查詢
- 16.病歷信息查詢
- 加群驗證
- 必看推薦閱讀【不斷更新】