1. 程式人生 > >使用PHP實現檔案上傳

使用PHP實現檔案上傳

       這裡使用PHP實現檔案的上傳,由在瀏覽器這邊選擇檔案,上傳到伺服器。其中,在上傳檔案中,考慮到對上傳檔案大小的限制、型別限制等問題。(當然可以根據我們需要修改對上傳的檔案的限制,而一般而言php自身也同樣對將要上傳的檔案大小進行了限制,預設為2M,也就是說我們不能上傳太大的圖片。)這裡我們限制使用者只能上傳jpg格式的圖片,此外,圖片大小不能超過2M。

檔案上傳介面 upload.php

提交含上傳檔案的表單時,表單form需要設定enctype屬性:

[php] view plain copy print?
  1. <form action=”” enctype="multipart/form-data"
     method=”post”>  
  2. 上傳檔案<input type=”file” name=”myfile”/>  
  3. <input type=”submit” value=”上傳”/>  
  4. </form>  
save_snippets.png
<form action=”” enctype="multipart/form-data" method=”post”>
上傳檔案<input type=”file” name=”myfile”/>
<input type=”submit” value=”上傳”/>
</form>

具體程式碼如下: [php]
view plain copy print?
  1. <html>  
  2. <head>  
  3. <meta http-equiv="content-type" content="text/html;charset=utf-8"/>  
  4. <title>上傳你的File吧</title>  
  5. </head>  
  6. <form enctype="multipart/form-data" method="post" action="uploadprocess.php">  
  7. <table>  
  8. <tr><td align="center"
     colspan="2"><font style="font-size:40px;font-family: 華文彩雲;">檔案上傳</font></td></tr>  
  9. <tr><td>請填寫使用者名稱:</td><td><input type="text" name="username"/></td></tr>  
  10. <tr><td>請簡單介紹該檔案</td><td><textarea name="fileintro" rows="10" cols="80"></textarea></td></tr>  
  11. <tr><td>請選擇你要上傳檔案:</td><td><input type="file" name="myfile"/></td></tr>  
  12. <tr><td><input type="submit" value="上傳檔案"/></td><td></td></tr>  
  13. </table>  
  14. </form>  
  15. </html>  
save_snippets.png
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>上傳你的File吧</title>
</head>
<form enctype="multipart/form-data" method="post" action="uploadprocess.php">
<table>
<tr><td align="center" colspan="2"><font style="font-size:40px;font-family: 華文彩雲;">檔案上傳</font></td></tr>
<tr><td>請填寫使用者名稱:</td><td><input type="text" name="username"/></td></tr>
<tr><td>請簡單介紹該檔案</td><td><textarea name="fileintro" rows="10" cols="80"></textarea></td></tr>
<tr><td>請選擇你要上傳檔案:</td><td><input type="file" name="myfile"/></td></tr>
<tr><td><input type="submit" value="上傳檔案"/></td><td></td></tr>
</table>
</form>
</html>

上傳檔案的處理  uploadprocess.php

[php] view plain copy print?
  1. <?php  
  2.     //1.接收提交檔案的使用者
  3.     $username=$_POST['username'];  
  4.     $fileintro=$_POST['fileintro'];  
  5.     //我們這裡需要使用到 $_FILES
  6.     /*echo "<pre>"; 
  7.     print_r($_FILES); 
  8.     echo "</pre>";*/
  9.     //其實我們在上傳檔案時,點選上傳後,資料由http協議先發送到apache伺服器那邊,這裡apache伺服器已經將上傳的檔案存放到了伺服器下的C:\windows\Temp目錄下了。這時我們只需轉存到我們需要存放的目錄即可。
  10.     //php中自身對上傳的檔案大小存在限制預設為2M
  11.     //獲取檔案的大小
  12.     $file_size=$_FILES['myfile']['size'];  
  13.     if($file_size>2*1024*1024) {  
  14.         echo"檔案過大,不能上傳大於2M的檔案";  
  15.         exit();  
  16.     }  
  17.     $file_type=$_FILES['myfile']['type'];  
  18.     echo$file_type;  
  19.     if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {  
  20.         echo"檔案型別只能為jpg格式";  
  21.         exit();  
  22.     }  
  23.     //判斷是否上傳成功(是否使用post方式上傳)
  24.     if(is_uploaded_file($_FILES['myfile']['tmp_name'])) {  
  25.         //把檔案轉存到你希望的目錄(不要使用copy函式)
  26.         $uploaded_file=$_FILES['myfile']['tmp_name'];  
  27.         //我們給每個使用者動態的建立一個資料夾
  28.         $user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;  
  29.         //判斷該使用者資料夾是否已經有這個資料夾
  30.         if(!file_exists($user_path)) {  
  31.             mkdir($user_path);  
  32.         }  
  33.         //$move_to_file=$user_path."/".$_FILES['myfile']['name'];
  34.         $file_true_name=$_FILES['myfile']['name'];  
  35.         $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));  
  36.         //echo "$uploaded_file   $move_to_file";
  37.         if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {  
  38.             echo$_FILES['myfile']['name']."上傳成功";  
  39.         } else {  
  40.             echo"上傳失敗";  
  41.         }  
  42.     } else {  
  43.         echo"上傳失敗";  
  44.     }  
  45. ?>  
save_snippets.png
<?php
	//1.接收提交檔案的使用者
	$username=$_POST['username'];
	$fileintro=$_POST['fileintro'];

	//我們這裡需要使用到 $_FILES
	/*echo "<pre>";
	print_r($_FILES);
	echo "</pre>";*/

	//其實我們在上傳檔案時,點選上傳後,資料由http協議先發送到apache伺服器那邊,這裡apache伺服器已經將上傳的檔案存放到了伺服器下的C:\windows\Temp目錄下了。這時我們只需轉存到我們需要存放的目錄即可。

	//php中自身對上傳的檔案大小存在限制預設為2M
	
	//獲取檔案的大小
	$file_size=$_FILES['myfile']['size'];
	if($file_size>2*1024*1024) {
		echo "檔案過大,不能上傳大於2M的檔案";
		exit();
	}

	$file_type=$_FILES['myfile']['type'];
	echo $file_type;
	if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {
		echo "檔案型別只能為jpg格式";
		exit();
	}


	//判斷是否上傳成功(是否使用post方式上傳)
	if(is_uploaded_file($_FILES['myfile']['tmp_name'])) {
		//把檔案轉存到你希望的目錄(不要使用copy函式)
		$uploaded_file=$_FILES['myfile']['tmp_name'];

		//我們給每個使用者動態的建立一個資料夾
		$user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;
		//判斷該使用者資料夾是否已經有這個資料夾
		if(!file_exists($user_path)) {
			mkdir($user_path);
		}

		//$move_to_file=$user_path."/".$_FILES['myfile']['name'];
		$file_true_name=$_FILES['myfile']['name'];
		$move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
		//echo "$uploaded_file   $move_to_file";
		if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {
			echo $_FILES['myfile']['name']."上傳成功";
		} else {
			echo "上傳失敗";
		}
	} else {
		echo "上傳失敗";
	}

?>

       上傳檔案需要考慮到如下細節:

(1)如何控制使用者上傳檔案的大小 < 2M

[php] view plain copy print?
  1. //獲取檔案的大小
  2. $file_size=$_FILES['myfile']['size'];  
  3. if($file_size>2*1024*1024) {  
  4.     echo"檔案過大,不能上傳大於2M的檔案";  
  5.     exit();  
  6. }  
save_snippets.png
//獲取檔案的大小
$file_size=$_FILES['myfile']['size'];
if($file_size>2*1024*1024) {
	echo "檔案過大,不能上傳大於2M的檔案";
	exit();
}
(2)如何控制使用者上傳的檔案型別 [php] view plain copy print?
  1. $file_type=$_FILES['myfile']['type'];  
  2. echo$file_type;  
  3. if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {  
  4.     echo"檔案型別只能為jpg格式";  
  5.     exit();  
  6. }  
save_snippets.png
$file_type=$_FILES['myfile']['type'];
echo $file_type;
if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {
	echo "檔案型別只能為jpg格式";
	exit();
}
(3)如何防止使用者圖片覆蓋問題 [php] view plain copy print?
  1. //把檔案轉存到你希望的目錄(不要使用copy函式)
  2. $uploaded_file=$_FILES['myfile']['tmp_name'];  
  3. //我們給每個使用者動態的建立一個資料夾
  4. $user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;  
  5. //判斷該使用者資料夾是否已經有這個資料夾
  6. if(!file_exists($user_path)) {  
  7.     mkdir($user_path);  
  8. }  
save_snippets.png
//把檔案轉存到你希望的目錄(不要使用copy函式)
$uploaded_file=$_FILES['myfile']['tmp_name'];

//我們給每個使用者動態的建立一個資料夾
$user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;
//判斷該使用者資料夾是否已經有這個資料夾
if(!file_exists($user_path)) {
	mkdir($user_path);
}
       為了防止不同使用者上傳的圖片檔名相同導致圖片被覆蓋的問題,我們只要為不同使用者建立一個資料夾就行了,不同使用者上傳的檔案儲存在不同資料夾中。

(4)如何防止同一個使用者的檔名相同的問題

[php] view plain copy print?
  1. $file_true_name=$_FILES['myfile']['name'];  
  2. $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));  
save_snippets.png
$file_true_name=$_FILES['myfile']['name'];
$move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
       上面我們解決了不同使用者圖片覆蓋的問題,但是如果同一使用者上傳了同一檔名不同檔案內容的圖片時,同樣也會發生檔案覆蓋的問題,我們只需從C:\windows\Temp目錄中上傳的檔案轉移到伺服器真正要儲存的目錄時將原檔名進行修改即可,而修改後的名字跟其他檔案重名的機率很低,修改後的名字由上傳檔案的時間秒數和隨機陣列成。