[TOC]
>[success]通過 PHP,可以把文件上傳到服務器。或者從服務器下載文件
## 創建一個文件上傳表單
**實例**
~~~
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
~~~
`<form>` 標簽的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"。
`<input>` 標簽的 type="file" 屬性規定了應該把輸入作為文件來處理。舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
## 創建上傳腳本
"upload_file.php" 文件含有供上傳文件的代碼:
~~~
<?php
if ($_FILES["file"]["error"] > 0){
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
~~~
通過使用 PHP 的全局數組$_FILES,你可以從客戶計算機向遠程服務器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:
<table>
<tbody><tr>
<td>$_FILES["file"]["name"]</td>
<td>被上傳文件的名稱</td>
</tr>
<tr>
<td>$_FILES["file"]["type"] </td>
<td>被上傳文件的類型</td>
</tr>
<tr>
<td>$_FILES["file"]["size"]</td>
<td>被上傳文件的大小,以字節計</td>
</tr>
<tr>
<td>$_FILES["file"]["tmp_name"]</td>
<td>存儲在服務器的文件的臨時副本的名稱</td>
</tr>
<tr>
<td>$_FILES["file"]["error"]</td>
<td>由文件上傳導致的錯誤代碼</td>
</tr>
</tbody></table>
## 上傳限制
**PHP.ini上傳文件配置項**
<table>
<tbody><tr>
<td>file_uploads = On /Off</td>
<td>是否允許文件上傳</td>
</tr>
<tr>
<td>upload_max_filesize = 2M</td>
<td>上傳的文件的最大大小 </td>
</tr>
<tr>
<td>post_max_size = 8M</td>
<td>POST數據所允許的最大大小</td>
</tr>
<tr>
<td>upload_tmp_dir </td>
<td>上傳文件放置的臨時目錄</td>
</tr>
</tbody></table>
**上傳表單的限制**
~~~
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
~~~
**PHP腳本的限制**
~~~
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)){
echo "條例要求"
}
?>
~~~
## 保存被上傳的文件
上面的例子在服務器的 PHP 臨時文件夾創建了一個被上傳文件的臨時副本。
這個臨時的復制文件會在腳本結束時消失。要保存被上傳的文件,我們需要把它拷貝到另外的位置:
~~~
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)){
if ($_FILES["file"]["error"] > 0){
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " already exists. ";
}else{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}else{
echo "Invalid file";
}
?>
~~~
## 多文件上傳
設置name屬性為數組格式,實現多文件上傳處理
~~~
<form action="82.php" method="post" enctype="multipart/form-data">
文件1:<input type="file" name = "upfile[]"/><br/>
文件2:<input type="file" name = "upfile[]"><br/>
<input type="submit" value="上傳文件"/>
</form>
~~~
通過屬性multiple來實現,multiple 屬性規定輸入字段可選擇多個值。
~~~
<form action="demo_form.asp" method="get">
Select images: <input type="file" name="img" multiple="multiple" />
<input type="submit" />
</form>
~~~
## 文件下載
~~~
<?php
$file="./Upload/575e163e8938f.pptx";
header("Content-type:application/octet-stream");//二進制文件
$fileName = basename($file);//獲得文件名
header("Content-Disposition:attachment;filename=$fileName");//下載窗口中顯示的文件名
header("Accept-ranges:bytes");//文件尺寸單位
header("Accept-length:".filesize($file));//文件大小
readfile($file);//讀出文件內容
?>
~~~
>[danger] 練習:實現多文件上件,做一個簡單的文件管理系統。
- 序言
- 第一章:準備工作
- 寫在學習之前的話
- web應用開發結構
- 開發工具/環境
- 第二章:展現層面(HTML/CSS)
- HTML簡介
- HTML基礎
- HTML編碼
- HTML鏈接
- HTML圖像
- HTML列表
- HTML表單
- HTML表格(分水嶺)
- HTML 實體
- HTML框架
- CSS層疊樣式表
- CSS選擇器
- CSS文本/字體
- CSS繼承和疊加
- CSS框模型
- CSS浮動(分水嶺)
- CSS定位
- CSS背景
- CSS圖標字體
- CSS補充
- 開發技巧
- 第三章:展現層面(Javascript)
- JS簡介
- JS實現
- JS輸出交互
- JS變量
- JS數據類型
- JS運算符
- JS流程控制(分水嶺)
- JS函數
- JS數組
- JS對象(分水嶺)
- JS數組對象
- JS字符串對象
- JS數學對象
- JS日期對象
- JS BOM對象(分水嶺)
- JS DOM對象
- JS事件對象
- JS元素對象
- JS DOM節點
- 第四章:展現層面(Jquery)
- JQ簡介
- JQ使用
- JQ選擇器
- JQ篩選
- JQ屬性
- JQ-CSS
- JQ事件
- JQ文檔處理
- JQ效果
- JQ-ajax
- 第五章:邏輯/業務層面(PHP)
- PHP簡介
- PHP變量
- PHP數據類型
- PHP常量
- PHP運算符
- PHP流程控制
- PHP函數(分水嶺)
- PHP日期
- PHP數學
- PHP數組
- PHP字符串
- PHP正則表達式(分水嶺)
- PHP目錄操作
- PHP文件
- PHP上傳/下載
- PHP面向對象(分水嶺)
- PHP圖像處理
- PHP會話控制
- Ajax異步處理
- PHPMysql擴展
- PHPMysqli擴展
- PHPPdo擴展
- PHP接口
- PHP命名空間
- 第六章:邏輯/業務層面(框架設計)
- 第七章:存儲層面(mysql)
- Mysql基礎
- Mysql Sql簡介
- Mysql數據庫
- Mysql數據類型
- Mysql數據表
- Mysql操作記錄
- Mysql查詢
- Mysql修改表結構
- Mysql日期與時間
- Mysql分組統計
- Mysql多表查詢
- Mysql安全
- Mysql存儲引擎
- Mysql事務
- Mysql視圖
- Mysql觸發器
- Mysql存儲過程
- Mysql存儲函數
- Mysql優化
- 第八章:服務器(Linux)
- Linux介紹與安裝
- Shell
- 目錄與文件操作
- VIM編輯器使用
- 帳號管理
- SUDO
- 權限控制
- 壓縮與打包
- 軟件安裝
- 計劃任務
- 進程管理
- 寶塔Linux面板