PHP中,文件上傳
更新時(shí)間:2006年12月06日 00:00:00 作者:
在PHP中,文件上傳一般是通過(guò)move_uploaded_file()來(lái)實(shí)現(xiàn)的。
bool move_uploaded_file ( string filename, string destination )本函數(shù)檢查并確保由 filename 指定的文件是合法的上傳文件(即通過(guò) PHP 的 HTTP POST 上傳機(jī)制所上傳的)。如果文件合法,則將其移動(dòng)為由 destination 指定的文件。
如果 filename 不是合法的上傳文件,不會(huì)出現(xiàn)任何操作,move_uploaded_file() 將返回 FALSE。
如果 filename 是合法的上傳文件,但出于某些原因無(wú)法移動(dòng),不會(huì)出現(xiàn)任何操作,move_uploaded_file() 將返回 FALSE。此外還會(huì)發(fā)出一條警告。
下面我們通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明PHP是如何實(shí)現(xiàn)文件上傳的。
test.php 的原文件
MAX_FILE_SIZE 隱藏字段(單位為字節(jié))必須放在文件輸入字段之前,其值為接收文件的最大尺寸。這是對(duì)瀏覽器的一個(gè)建議,PHP 也會(huì)檢查此項(xiàng)。在瀏覽器端可以簡(jiǎn)單繞過(guò)此設(shè)置,因此不要指望用此特性來(lái)阻擋大文件。實(shí)際上,PHP 設(shè)置中的上傳文件最大值是不會(huì)失效的。但是最好還是在表單中加上此項(xiàng)目,因?yàn)樗梢员苊庥脩粼诨〞r(shí)間等待上傳大文件之后才發(fā)現(xiàn)文件過(guò)大上傳失敗的麻煩。
注: 要確保文件上傳表單的屬性是 enctype="multipart/form-data",否則文件將無(wú)法上傳。
在處理上傳頁(yè)面中,上傳文件的信息是通過(guò)數(shù)組 $_FILES 來(lái)獲取的。我們假設(shè)文件上傳字段的名稱如上例所示,為 "upfile",則文件信息為:
$_FILES['upfile']['name']
上傳文件的原文件名。
$_FILES['upfile']['type']
文件的 MIME 類型,如果瀏覽器提供此信息的話。一個(gè)例子是“image/gif”。不過(guò)此 MIME 類型在 PHP 端并不檢查,因此不要想當(dāng)然認(rèn)為有這個(gè)值。
$_FILES['upfile']['size']
上傳文件的大小,單位為字節(jié)。
$_FILES['upfile']['tmp_name']
文件上傳后在服務(wù)端儲(chǔ)存的臨時(shí)文件名。
$_FILES['upfile']['error']
和該文件上傳相關(guān)的錯(cuò)誤代碼。
PHP 將隨文件信息數(shù)組一起返回一個(gè)對(duì)應(yīng)的錯(cuò)誤代碼。該代碼可以在文件上傳時(shí)生成的文件數(shù)組中的 error 字段中被找到。代碼如下:
UPLOAD_ERR_OK
其值為 0,文件上傳成功。
UPLOAD_ERR_INI_SIZE
其值為 1,上傳的文件超過(guò)了 php.ini 中 upload_max_filesize 選項(xiàng)限制的值 ,默認(rèn)值為2M。 如果要想上傳更大的,我們可以在php.ini里查找 upload_max_filesize = 2M 修改后即可生效。
UPLOAD_ERR_FORM_SIZE
其值為 2,上傳文件的大小超過(guò)了 HTML 表單中 MAX_FILE_SIZE 選項(xiàng)指定的值。
UPLOAD_ERR_PARTIAL
其值為 3,文件上傳不完全,只有部分被上傳。
UPLOAD_ERR_NO_FILE
其值為 4,文件上傳失敗。
UPLOAD_ERR_NO_TMP_DIR
其值為 6,找不到臨時(shí)文件夾。PHP 4.3.10 和 PHP 5.0.3 引進(jìn)。
UPLOAD_ERR_CANT_WRITE
其值為 7,文件寫入失敗。PHP 5.1.0 引進(jìn)。
注: 以上值在 PHP 4.3.0 之后變成了 PHP 常量。
action.php 的原代碼
<?
/**
歡迎光臨我們來(lái)我站交流學(xué)習(xí)經(jīng)驗(yàn)
*/
function getname($exname){
$dir = "tmp/";
$i=1;
if(!is_dir($dir)){
mkdir($dir,0777);
}
while(true){
if(!is_file($dir.$i.".".$exname)){
$name=$i.".".$exname;
break;
}
$i++;
}
return $dir.$name;
}
$exname=strtolower(substr($_FILES['upfile']['name'],(strrpos($_FILES['upfile']['name'],'.')+1)));
$uploadfile = getname($exname);
if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile)) {
echo "<h2><font color=#ff0000>文件上傳成功!</font></h2><br><br>";
}else {
echo "<h2><font color=#ff0000>文件上傳失??!</font></h2><br><br>";
}
echo "下面是文件上傳的一些信息:
<br><br>原文件名:".$_FILES['upfile']['name'] .
"<br><br>類型:" .$_FILES['upfile']['type'] .
"<br><br>臨時(shí)文件名:".$_FILES['upfile']['tmp_name'].
"<br><br>文件大?。?.$_FILES['upfile']['size'] .
"<br><br>錯(cuò)誤代碼:".$_FILES['upfile']['error'];
?>
一定要確保上傳后文件所在的文件夾的權(quán)限至為 777 ,這點(diǎn)在服務(wù)器上體現(xiàn)的特別明顯,有時(shí)我們編寫的上傳代碼沒(méi)有任何的錯(cuò)誤,然而在網(wǎng)上卻無(wú)法實(shí)現(xiàn)上傳功能,原因就在這里。
本文只是講了如何通過(guò)PHP來(lái)實(shí)現(xiàn)文件上傳的,沒(méi)看過(guò)這部分的朋友可以參考一下。
bool move_uploaded_file ( string filename, string destination )本函數(shù)檢查并確保由 filename 指定的文件是合法的上傳文件(即通過(guò) PHP 的 HTTP POST 上傳機(jī)制所上傳的)。如果文件合法,則將其移動(dòng)為由 destination 指定的文件。
如果 filename 不是合法的上傳文件,不會(huì)出現(xiàn)任何操作,move_uploaded_file() 將返回 FALSE。
如果 filename 是合法的上傳文件,但出于某些原因無(wú)法移動(dòng),不會(huì)出現(xiàn)任何操作,move_uploaded_file() 將返回 FALSE。此外還會(huì)發(fā)出一條警告。
下面我們通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明PHP是如何實(shí)現(xiàn)文件上傳的。
test.php 的原文件
復(fù)制代碼 代碼如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>網(wǎng)站文件上傳實(shí)例</title>
<!--
-->
</head>
<body>
<form enctype="multipart/form-data" action=action.php method=post>
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type=file name=upfile size=20>
<input type=submit value='上傳文件'>
</form>
</body>
</html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>網(wǎng)站文件上傳實(shí)例</title>
<!--
-->
</head>
<body>
<form enctype="multipart/form-data" action=action.php method=post>
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type=file name=upfile size=20>
<input type=submit value='上傳文件'>
</form>
</body>
</html>
MAX_FILE_SIZE 隱藏字段(單位為字節(jié))必須放在文件輸入字段之前,其值為接收文件的最大尺寸。這是對(duì)瀏覽器的一個(gè)建議,PHP 也會(huì)檢查此項(xiàng)。在瀏覽器端可以簡(jiǎn)單繞過(guò)此設(shè)置,因此不要指望用此特性來(lái)阻擋大文件。實(shí)際上,PHP 設(shè)置中的上傳文件最大值是不會(huì)失效的。但是最好還是在表單中加上此項(xiàng)目,因?yàn)樗梢员苊庥脩粼诨〞r(shí)間等待上傳大文件之后才發(fā)現(xiàn)文件過(guò)大上傳失敗的麻煩。
注: 要確保文件上傳表單的屬性是 enctype="multipart/form-data",否則文件將無(wú)法上傳。
在處理上傳頁(yè)面中,上傳文件的信息是通過(guò)數(shù)組 $_FILES 來(lái)獲取的。我們假設(shè)文件上傳字段的名稱如上例所示,為 "upfile",則文件信息為:
$_FILES['upfile']['name']
上傳文件的原文件名。
$_FILES['upfile']['type']
文件的 MIME 類型,如果瀏覽器提供此信息的話。一個(gè)例子是“image/gif”。不過(guò)此 MIME 類型在 PHP 端并不檢查,因此不要想當(dāng)然認(rèn)為有這個(gè)值。
$_FILES['upfile']['size']
上傳文件的大小,單位為字節(jié)。
$_FILES['upfile']['tmp_name']
文件上傳后在服務(wù)端儲(chǔ)存的臨時(shí)文件名。
$_FILES['upfile']['error']
和該文件上傳相關(guān)的錯(cuò)誤代碼。
PHP 將隨文件信息數(shù)組一起返回一個(gè)對(duì)應(yīng)的錯(cuò)誤代碼。該代碼可以在文件上傳時(shí)生成的文件數(shù)組中的 error 字段中被找到。代碼如下:
UPLOAD_ERR_OK
其值為 0,文件上傳成功。
UPLOAD_ERR_INI_SIZE
其值為 1,上傳的文件超過(guò)了 php.ini 中 upload_max_filesize 選項(xiàng)限制的值 ,默認(rèn)值為2M。 如果要想上傳更大的,我們可以在php.ini里查找 upload_max_filesize = 2M 修改后即可生效。
UPLOAD_ERR_FORM_SIZE
其值為 2,上傳文件的大小超過(guò)了 HTML 表單中 MAX_FILE_SIZE 選項(xiàng)指定的值。
UPLOAD_ERR_PARTIAL
其值為 3,文件上傳不完全,只有部分被上傳。
UPLOAD_ERR_NO_FILE
其值為 4,文件上傳失敗。
UPLOAD_ERR_NO_TMP_DIR
其值為 6,找不到臨時(shí)文件夾。PHP 4.3.10 和 PHP 5.0.3 引進(jìn)。
UPLOAD_ERR_CANT_WRITE
其值為 7,文件寫入失敗。PHP 5.1.0 引進(jìn)。
注: 以上值在 PHP 4.3.0 之后變成了 PHP 常量。
action.php 的原代碼
<?
/**
歡迎光臨我們來(lái)我站交流學(xué)習(xí)經(jīng)驗(yàn)
*/
function getname($exname){
$dir = "tmp/";
$i=1;
if(!is_dir($dir)){
mkdir($dir,0777);
}
while(true){
if(!is_file($dir.$i.".".$exname)){
$name=$i.".".$exname;
break;
}
$i++;
}
return $dir.$name;
}
$exname=strtolower(substr($_FILES['upfile']['name'],(strrpos($_FILES['upfile']['name'],'.')+1)));
$uploadfile = getname($exname);
if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile)) {
echo "<h2><font color=#ff0000>文件上傳成功!</font></h2><br><br>";
}else {
echo "<h2><font color=#ff0000>文件上傳失??!</font></h2><br><br>";
}
echo "下面是文件上傳的一些信息:
<br><br>原文件名:".$_FILES['upfile']['name'] .
"<br><br>類型:" .$_FILES['upfile']['type'] .
"<br><br>臨時(shí)文件名:".$_FILES['upfile']['tmp_name'].
"<br><br>文件大?。?.$_FILES['upfile']['size'] .
"<br><br>錯(cuò)誤代碼:".$_FILES['upfile']['error'];
?>
一定要確保上傳后文件所在的文件夾的權(quán)限至為 777 ,這點(diǎn)在服務(wù)器上體現(xiàn)的特別明顯,有時(shí)我們編寫的上傳代碼沒(méi)有任何的錯(cuò)誤,然而在網(wǎng)上卻無(wú)法實(shí)現(xiàn)上傳功能,原因就在這里。
本文只是講了如何通過(guò)PHP來(lái)實(shí)現(xiàn)文件上傳的,沒(méi)看過(guò)這部分的朋友可以參考一下。
相關(guān)文章
使用PHP連接數(shù)據(jù)庫(kù)_實(shí)現(xiàn)用戶數(shù)據(jù)的增刪改查的整體操作示例
下面小編就為大家?guī)?lái)一篇使用PHP連接數(shù)據(jù)庫(kù)_實(shí)現(xiàn)用戶數(shù)據(jù)的增刪改查的整體操作示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09php中重定向網(wǎng)頁(yè)跳轉(zhuǎn)方法總結(jié)案例教程
這篇文章主要介紹了php中重定向網(wǎng)頁(yè)跳轉(zhuǎn)方法總結(jié)案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08php 實(shí)現(xiàn)銀聯(lián)商務(wù)H5支付的示例代碼
這篇文章主要介紹了php 實(shí)現(xiàn)銀聯(lián)商務(wù)H5支付的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10CI框架教程之優(yōu)化驗(yàn)證碼機(jī)制詳解【驗(yàn)證碼輔助函數(shù)】
這篇文章主要介紹了CI框架教程之優(yōu)化驗(yàn)證碼機(jī)制,結(jié)合實(shí)例形式詳細(xì)分析了CodeIgniter框架驗(yàn)證碼輔助函數(shù)相關(guān)使用及優(yōu)化操作技巧,需要的朋友可以參考下2019-04-04Discuz論壇標(biāo)題和底部去掉版權(quán)信息實(shí)例講解
這篇文章主要介紹了Discuz論壇標(biāo)題和底部去掉版權(quán)信息實(shí)例講解,有正好遇到這個(gè)問(wèn)題但是不知道修改哪個(gè)文件的同學(xué)可以跟著操作下,可以節(jié)省很多不必要的時(shí)間2021-03-03