PHP實(shí)現(xiàn)本地圖片上傳和驗(yàn)證功能
今天研究了一下PHP的FILES函數(shù),使用PHP實(shí)現(xiàn)本地圖片的上傳,驗(yàn)證文件是否為圖片,并將圖片保存在指定目錄下,實(shí)現(xiàn)游覽圖片的功能,感覺還是很好玩的,一共有兩個PHP頁面,一個作為前臺的上傳和圖片展示,另一個用來處理保存圖片,代碼里做了很詳細(xì)的注釋,并將FILES函數(shù)的語法,error報錯類型寫了出來,還有一些注意事項(xiàng)。
FILES函數(shù)
1、$_FILES[‘myFile'][‘name'] 客戶端文件的原名稱
2、$_FILES[‘myFile'][‘type'] 文件的 MIME類型,需要瀏覽器提供該信息的支持,例如”image/gif”
3、$_FILES[‘myFile'][‘size'] 已上傳文件的大小,單位為字節(jié)
4、$_FILES[‘myFile'][‘tmp_name'] 文件被上傳后在服務(wù)端儲存的臨時文件名,一般是系統(tǒng)默認(rèn),可以在php.ini的upload_tmp_dir指定
關(guān)于FILES中error報錯類型及其注意:
過濾錯誤號
0: 沒有錯誤發(fā)生,文件上傳成功
1: 上傳的文件超過了 php.ini 中 upload_max_filesize選項(xiàng)限制的值
2: 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項(xiàng)指定的值
3: 文件只有部分被上傳
4: 沒有文件被上傳
5: 上傳文件大小為0
注意:
1、文件被上傳結(jié)束后,默認(rèn)地被存儲在了臨時目錄中,這時必須將它從臨時目錄中刪除或移動到其它地方,如果沒有,則會被刪除。也就是不管是否上傳成功,腳本執(zhí)行完后臨時目錄里的文件肯定會被刪除。所以在刪除之前要用PHP的copy() 函數(shù)將它復(fù)制到其它位置,此時,才算完成了上傳文件過程。
2、在 PHP 4.1.0 版本以前該數(shù)組的名稱為$HTTP_POST_FILES,它并不像_FILES 一樣是自動全局變量。PHP 3 不支持HTTP_POST_FILES數(shù)組。
3、用form上傳文件時,一定要加上屬性內(nèi)容enctype=”multipart/form-data”,否則用$_FILES[filename]獲取文件信息時會報異常。
以下是代碼
index.php
<?php
header("Content-Type:text/html;charset=utf-8");
?>
<title>PHP實(shí)現(xiàn)圖片的上傳和驗(yàn)證</title>
<style>
table{text-align:center;}
</style>
<div align="center">
<h1>上傳功能</h1>
<form action="index_ok.php" method="post" enctype="multipart/form-data">
上傳圖片:<input type="file" name="pic">
<input type="submit" name="sub" value="上傳">
</form>
<table width="500">
<tr bgcolor="#cccccc">
<th>序號</th>
<th>圖片</th>
<th>添加時間</th>
<th>操作</th>
</tr>
<?php
//1 打開目錄
$dir=opendir("./uploads");
//2 遍歷目錄,輸出里面的圖片
$i=0;
while($f=readdir($dir)){
$i++;
//讀取目錄中的文件,模擬數(shù)據(jù)庫操作
if($f!="." && $f!=".."){
$filename="./uploads/$f";
echo "<tr>";
echo "<td>{$i}</td>";
echo "<td><img src='./uploads/{$f}' width='80' height='60'></td>";
echo "<td>".date("Y-m-d",filectime($filename))."</td>";
echo "<td><a href='./uploads/{$f}'>查看</a></td>";
echo "</tr>";
}
}
//3 關(guān)閉目錄
closedir($dir);
?>
<tr bgcolor="#cccccc"><td colspan="4"> </td></tr>
</table>
</div>
upload.php
<?php
header("Content-Type:text/html;charset=utf-8");
if($_FILES['pic']['error']>0){
echo $_FILES['pic']['error'];
echo "上傳文件錯誤!";
echo '<meta http-equiv="refresh" content="3;url=index.php">'; //自動跳轉(zhuǎn)回index文件
}else{
//開始獲取上傳文件的信息
$file=$_FILES['pic'];
//var_dump($file);打印文件里的全部信息
//name:上傳文件名
//type:上傳文件的類型
//tmp_name:上傳成功后的臨時文件
//size:上傳文件的大小
//error:上傳文件的錯誤信息
$uploaddir="./uploads/"; //選擇要上傳的文件存放目錄
//$uploadfile=$uploaddir.basename($file['name']);//獲得上傳文件的名稱
//解析文件的名字
$fileinfo=pathinfo($file['name']);
// echo $fileinfo['extension']; 獲取文件的類型
do{
$newfile=date("YmdHis").rand(1000,9999).".".$fileinfo['extension'];//更改文件的名字,獲取一個新的名字
}while(file_exists($uploaddir.$newfile));
//上傳文件的類型限制
if (!(($file['type'] == "image/gif")||($file['type'] == "image/jpeg")||($file['type'] == "image/pjpeg"))){
die("文件類型錯誤!");
echo '<meta http-equiv="refresh" content="3;url=index.php">';
}
//上傳文件的大小限制
if($file['size'] > 2*1024*1024){
die("上傳文件超過2MB!");
echo '<meta http-equiv="refresh" content="3;url=index.php">';
}
//開始上傳文件
if (is_uploaded_file($file['tmp_name'])) {
if (move_uploaded_file($file['tmp_name'], $uploaddir.$newfile)) {
echo "上傳成功!";
echo '<meta http-equiv="refresh" content="3;url=index.php">';//自動跳轉(zhuǎn)回index文件
} else {
echo "上傳失敗,請稍等!";
echo '<meta http-equiv="refresh" content="3;url=index.php">'; //自動跳轉(zhuǎn)回index文件
}
}
}
?>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Sortable.js功能強(qiáng)大的JavaScript 拖拽庫示例詳解
SortableJS 是一個強(qiáng)大、靈活且易于使用的 JavaScript 庫,適用于各種類型的拖放排序需求,這篇文章主要介紹了Sortable.js功能強(qiáng)大的JavaScript 拖拽庫示例詳解,需要的朋友可以參考下2025-01-01
30分鐘快速入門掌握ES6/ES2015的核心內(nèi)容(下)
這篇文章主要給大家介紹了如何通過30分鐘快速入門掌握ES6/ES2015的核心內(nèi)容的相關(guān)資料,之前給大家介紹過基礎(chǔ)的一些內(nèi)容,下面繼續(xù)來介紹一些其他的新特性,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
淺談webpack 構(gòu)建性能優(yōu)化策略小結(jié)
webpack以其豐富的功能和靈活的配置而深受業(yè)內(nèi)吹捧,逐步取代了grunt和gulp成為大多數(shù)前端工程實(shí)踐中的首選,這篇文章主要介紹了淺談webpack 構(gòu)建性能優(yōu)化策略小結(jié),感興趣的小伙伴們可以參考一下2018-06-06
JavaScript中的動態(tài)?import()用法示例解析
這篇文章主要為大家介紹了JavaScript中的動態(tài)import()用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
深入淺析JavaScript面向?qū)ο蠛驮秃瘮?shù)
這篇文章主要介紹了深入淺析JavaScript面向?qū)ο蠛驮秃瘮?shù)的相關(guān)資料,需要的朋友可以參考下2016-02-02
JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法示例
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了JavaScript觀察者模式概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-07-07
微信小程序開發(fā)之大轉(zhuǎn)盤 仿天貓超市抽獎實(shí)例
本篇文章主要介紹了微信小程序開發(fā)之大轉(zhuǎn)盤 仿天貓超市抽獎實(shí)例,這里整理了詳細(xì)的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12
JS動態(tài)修改iframe內(nèi)嵌網(wǎng)頁地址的方法
這篇文章主要介紹了JS動態(tài)修改iframe內(nèi)嵌網(wǎng)頁地址的方法,涉及javascript動態(tài)修改iframe中src屬性的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
前端實(shí)現(xiàn)列表多條件查詢/搜索功能兩種實(shí)現(xiàn)方法
我們在開發(fā)過程中,特別是數(shù)據(jù)庫系統(tǒng)的開發(fā)中經(jīng)常會遇到多條件的查詢狀況這篇文章主要給大家介紹了關(guān)于前端實(shí)現(xiàn)列表多條件查詢/搜索功能的兩種實(shí)現(xiàn)方法,需要的朋友可以參考下2024-08-08
原生js仿jquery實(shí)現(xiàn)對Ajax的封裝
大家都知道jquery在我們?nèi)粘i_發(fā)中的使用頻率非常高,但jquery說到底還是對js的封裝,我們不能光會使用,只有知道了其中的遠(yuǎn)離才能更好的使用,所以這篇文章主要介紹的是原生js仿jquery實(shí)現(xiàn)對Ajax封裝的方法。2016-10-10

