?? ???? "PHP?? ?? ??? ?? ???? ??? ??????"? ??????. (?? ??) "??? PHP? ?? ??? ?? ??? ??? ?????. ?? ???? PHP?? ??? ????? ??? ???????. ???? ??? ??? ????!

??? ?????? ????? ??? ?????? ???? ??? ??? ??? ? ??? ????? ??? ?? ??? ???. ??? PHP ???? ??? ?????? ??? ?? ???? ? ?? ???? PHP ?? ????? ?? ??? ?? ? ????? ??? ??? ???? ??? ???????.
php.ini
??php.ini
想要使用文件上傳的功能,首先我們需要配置php.ini,對(duì)其中的參數(shù)進(jìn)行合理地設(shè)置。那我們先來看一下應(yīng)該怎樣去找到php.ini文件。示例如下:
首先我們輸入:
<?php
phpinfo();
?>
輸出結(jié)果:

由上述結(jié)果中,在Loaded Configuration File一欄中可以看到php.ini的具體路徑。由此便找到了php.ini文件。
php.ini中的文件太多可以使用ctrl+F來搜索相關(guān)配置項(xiàng)。那我們需要配置的參數(shù)如下:
file_uploads
: on,說明服務(wù)器開啟了文件上傳功能;如果為 off,則說明服務(wù)器關(guān)閉了文件上傳功能。
upload_tmp_dir
:上傳文件的臨時(shí)目錄。在文件被成功上傳之前,文件首先會(huì)存放到服務(wù)器端的臨時(shí)目錄中,不設(shè)置的為系統(tǒng)默認(rèn)的目錄。
upload_max_filesize
:服務(wù)器允許上傳文件的最大值,以MB為單位。
max_execution_time
:PHP 中一個(gè)指令所能執(zhí)行的最大時(shí)間,單位是秒。
memory_limit
:PHP 中一個(gè)指令所分配的內(nèi)存空間,單位是 MB。
其中我們需要注意的是:配置完成后想要配置生效的話,需要重啟Apache 服務(wù)器,配置的參數(shù)才生效。
預(yù)定義變量 $_FILES
在我們配置完php.ini之后,我們就需要通過預(yù)定義變量$_FILES 來對(duì)上傳文件做一些限制和判斷。$_FILES 變量存儲(chǔ)的是上傳文件的相關(guān)信息,其需要保存的信息如下:
$_FILES[filename][name]
:保存上傳文件的文件名
$_FILES[filename][size]
: 保存上傳文件的大小
$_FILES[filename][tmp_name]
: 保存上傳文件的臨時(shí)名稱
$_FILES[filename][type]
:保存上傳文件的類型
$_FILES[filename][error]
: 保存上傳文件結(jié)果的代號(hào),0 則表示成功
我們可以通過預(yù)定義變量 $_FILES結(jié)合HTML進(jìn)行示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHP文件上傳</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" value="上傳">
</form>
</body>
</html>
<?php
if(!empty($_FILES)){
foreach ($_FILES['upfile'] as $key => $value) {
echo $key.'=>'.$value.'<br>';
}
}
?>
運(yùn)行程序后,根據(jù)表單選擇要上傳的文件,我以test1.txt為例,輸出結(jié)果為:

根據(jù)保存的信息我們可以得出該文件的相關(guān)信息:
文件名為test1.txt;上傳文件的類型為text/plain;保存上傳文件的臨時(shí)名稱為C:WindowsphpD16F.tmp;0 則表示上傳文件成功;文件的大小為5。
單文件上傳
通過上面的代碼,我們已經(jīng)得到了要上傳文件的基本信息,接下來我們需要使用 move_uploaded_file()
函數(shù)來實(shí)現(xiàn)上傳。它的主要功能就是把剛才上傳的文件移動(dòng)到一個(gè)新的位置。它的語法格式如下:
move_uploaded_file(string $filename, string $destination)
其中$filenameb
表示的是上傳文件的文件名,這個(gè)文件名并不是上傳文件的原文件名,而是通過上一步$_FILES中tmp_name得到的文件名;$destinationb
?? ??? ??? ????? ?? php.ini? ???? ????? ???? ???? ???. ?? php.ini ??? ?? ??? ???????. ?? ??? ????.
?? ?????:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHP文件上傳</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" value="上傳">
</form>
</body>
</html>
<?php
if(!empty($_FILES)){
$tmpname = $_FILES['upfile']['tmp_name']; // 臨時(shí)文件名稱
$name = $_FILES['upfile']['name']; // 文件的原名稱
$path = './phptest'; // 上傳目錄
$file_name = date('YmdHis').rand(100,999).$name;// 避免文件重名,更改文件名稱
if(move_uploaded_file($tmpname, $path.'/'.$file_name)){
echo $name." 上傳成功!";
}else{
echo $name." 上傳失?。?quot;;
}
}
?>
?? ??:

? ???? ??? ?? ?? ??? php.ini? ?? ??? ??? ? ????. ?? ?? php.ini ??? ???????. 
php.ini? ??? ?? ??? Ctrl+F? ???? ?? ?? ??? ??? ? ????. ?? ?? ???? ?? ????? ??? ????: ??
- ??
file_uploads
: on, ??? ??? ?????? ?????. ??? ??? ?? ??? ??? ?? ??? ??? ??? ?????. ?? - ??
upload_tmp_dir
: ?? ???? ?? ?? ???????. ??? ????? ????? ?? ??? ?? ?? ?? ?? ????? ?????. ???? ?? ?? ?? ????? ??? ?? ????? ???. ?? - ??
upload_max_filesize
: ???? ???? ? ?? ?? ?? ??(MB)???. ?? - ??
max_execution_time
: PHP?? ??? ??? ? ?? ?? ??(?)???. ?? - ??
memory_limit
: PHP?? ???? ??? ??? ??(MB)???. ??
?????? ? ?? ??? ??? ? ??? ????? Apache ??? ?? ???? ??? ????? ????? ????. ?????????? ??? ?? $_FILES????php.ini? ??? ? ?? ??? ?? $_FILES? ???? ???? ??? ?? ? ?? ??? ??? ??? ???. $_FILES ??? ???? ??? ?? ??? ?????. ???? ?? ??? ??? ????: ??
- ??
$_FILES[filename][ name]
: ???? ??? ?? ??? ????? ?? - ??
$_FILES[filename][size]
: ???? ??? ??? ????? ?? li> - ??
$_FILES[filename][tmp_name]
: ???? ??? ?? ??? ????? ?? - ??
$_FILES[filename][type]
: ???? ??? ?????. ?? - ??
$_FILES[filename][error]
: ???? ?? ??? ?? ??? ?????. 0? ??? ???????< /li>
???? ??? ?? $_FILES? HTML? ???? ???? ?? ??? ????. ??
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHP文件上傳</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="upfile[]"><br>
<input type="file" name="upfile[]"><br>
<input type="file" name="upfile[]"><br>
<input type="submit" value="上傳">
</form>
</body>
</html>
<?php
if(!empty($_FILES)){
$tmpname = $_FILES['upfile']['tmp_name'];
$name = $_FILES['upfile']['name'];
$path = './phptest';
for ($i=0; $i < count($tmpname); $i++) {
$file_name = date('YmdHis').rand(100,999).$name[$i];
if(move_uploaded_file($tmpname[$i], $path.'/'.$file_name)){
echo $name[$i].' 上傳成功!<br>';
}else{
echo $name[$i].' 上傳失??!<br>';
}
}
}
?>
??????? ??? ? test1.txt ??? ?? ???? ??? ?????. ?? ??? ??? ????. ????

??????? ??? ?? ??? ?? ??? ?? ? ????. ??: ?????? ??? test1.txt, ???? ?? ??? text/plain, ??? ?? ?? ???? ??? C:WindowsphpD16F.tmp???. 0? ?? ??? 5?? ?????. ?????????? ?? ????????? ??? ?? ???? ??? ?? ??? ?????. ????
move_uploaded_file()</code? ???? ???. > ?? ???? ?????. ?? ??? ?? ???? ??? ? ??? ???? ????. ?? ??? ??? ????. ??rrreee????? <code>$filenameb
? ???? ??? ?? ??? ?????. ? ?? ??? ???? ??? ?? ?? ??? ??? $_FILES? tmp_name? ?? ????. ?? ???? ?? ??,
$destinationb
? ???? ??? ??? ??? ?????. ???????? ??? ????? ???? TRUE? ????, ???? FALSE? ?????. ???????? ?? ???????. ?????? ?? test1.txt ??? ?? ????? ??? phptest?? ??? ??????. ??? ??? ????. ??rrreee??? ?? ??? ???? ?. ??? ???? ?? ??? ??? ????.????????
如此則表示我想要上傳的test2.txt已經(jīng)上傳到我需要的目錄中了:

多文件上傳
通過上述示例已經(jīng)了解了單文件上傳的過程,但是在日常使用中經(jīng)常會(huì)用到的是多文件上傳,那多文件上傳應(yīng)該怎么操作呢?
示例如下:
還和上面的示例一樣,上傳多個(gè)文件到我在根目錄里創(chuàng)建的phptest文件夾里
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHP文件上傳</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="upfile[]"><br>
<input type="file" name="upfile[]"><br>
<input type="file" name="upfile[]"><br>
<input type="submit" value="上傳">
</form>
</body>
</html>
<?php
if(!empty($_FILES)){
$tmpname = $_FILES['upfile']['tmp_name'];
$name = $_FILES['upfile']['name'];
$path = './phptest';
for ($i=0; $i < count($tmpname); $i++) {
$file_name = date('YmdHis').rand(100,999).$name[$i];
if(move_uploaded_file($tmpname[$i], $path.'/'.$file_name)){
echo $name[$i].' 上傳成功!<br>';
}else{
echo $name[$i].' 上傳失敗!<br>';
}
}
}
?>
輸出結(jié)果:

如此結(jié)果顯示,多個(gè)文件已經(jīng)上傳到我的文件夾里了:

推薦學(xué)習(xí):《PHP視頻教程》
? ??? PHP? ??? ????? ??? ?????? ?? ?? ???? ? ???!? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!