1. 程式人生 > >PHP中檔案上傳的功能模組實現

PHP中檔案上傳的功能模組實現

最近專案中PHP使用的比較多,對於一個前端的使用者,對其中的一些知識點記錄下來。今天講一下,檔案上傳的功能實現的一些知識。之前在專案中使用的nodejs實現過類似的功能,用PHP在做的時候,發現差不多大同小異。背後的邏輯差不多都是一樣的。

1.前端頁面要做的是,首先是提交方式必須修改為post,因為檔案上傳和大資料的傳輸,post更合適。需要注意的地方如下:

             

2.然後當前端頁面提交後,剩餘的就是我們後端需要處理的事情了。首先獲得檔案的字尾名。並對檔案的存放位置進行設定。

      

上述就是我們對上傳的檔案做的解析,獲得到檔案的字尾名和我們書寫的生成隨機數函式。我們通過PHP中的函式$_FILES獲得我們提交檔案的各個資訊,然後通過pathinfo()函式得到檔案的字尾名。在專案中,我使用了一個獲取當前時間和隨機六位陣列成的一個名字作為檔案的名字,通過函式move_uploaded_file()對檔案的儲存路徑進行了調整,這樣我們就獲得了上傳檔案的並儲存在我們指定的檔案。這樣就完成了我們專案需要的功能。當然我們還可以對檔案上傳的型別和大小進行一定的限制。對於出現的錯誤進行一定的組織和輸出,這樣讓使用者更加的智慧,我們把上述的功能進行了封裝,這樣我們就製作了一個簡單的上傳功能的模組。之前在nodejs中使用的是中介軟體實現的。對於PHP我們發現更多的內部寫好的函式。不過實現的邏輯是一樣的。

先看看我們實現隨機數的函式:

//隨機檔案的格式 20171211 152230asdasd
function getrandname() {
    $string =date('YmdHis');     //獲得當前時間
    for ($i = 0; $i < 6; $i++) {
       switch (mt_rand(0,2)) {
           case 0:
              $string.=chr(mt_rand(97,112));
               break;
           case 1:
              $string.=chr(mt_rand(65,90));
               break;
           case 2:
              $string.=mt_rand(0,9);
               break;   
       }
    }
    return  $string;
}

通過上面的函式我們獲得了隨機的檔名字。通過我上面敘述的方式,我們完成了對上傳檔案的命名和存放。

$info = pathinfo($_FILES["f1"]["name"],PATHINFO_EXTENSION);

print_r($info);     //獲得檔名字尾
echo "<br/>";

$str =getrandname();     //獲取隨機數
$dist = $str.".".$info;

print_r($dist);
echo "<br/>";

$tmp = $_FILES["f1"]["tmp_name"];
$strmove = "d:/uploder/".$dist;

print_r($strmove);

move_uploaded_file($tmp,$strmove);
當然,對於常用的功能,我們一般都是封裝成一個函式的,這樣方便我們隨時呼叫。這樣我們就完成了全部的工作,現在把所有的程式碼附上:
<?php
/**

 */
//定義錯誤編碼與錯誤資訊的對應關係
$errorInfo=[
	'1001'=>'檔案超過php.ini限',
	'1002'=>'檔案超過html限制',
	'1003'=>'檔案上傳不完整',
	'1004'=>'沒有選擇檔案',
	'1006'=>'伺服器內部錯誤',
	'1007'=>'伺服器內部錯誤',
	'1008'=>'檔案太大',
	'1009'=>'檔案型別不合法',
	'1010'=>'檔案移動失敗'
];

//設計者
function uploads($file,$mime,$maxsize,$path){
	//判斷檔案上傳錯誤
	switch($file['error']){
		case 1:
			return 1001;//'檔案超過php.ini限制';
			break;
		case 2:
			return 1002;//'檔案超過html限制';
			break;
		case 3:
			return 1003;//'檔案上傳不完整';
			break;
		case 4:
			return 1004;//'沒有選擇檔案';
			break;
		case 6:
			return 1006;//'伺服器內部錯誤';
			break;
		case 7:
			return 1007;//'伺服器內部錯誤';
            break;   
	}

	if($file['size']>$maxsize){
		return 1008;                          //檔案太大;
	}

	//判斷使用者上傳的檔案型別是否合法
	if(!in_array($file['type'],$mime)){
		return 1009;                        //檔案型別不合法;
	}

	$tmp = $file['tmp_name'];

	$fileName = getRandName();
	//獲取檔案的副檔名
	$ext = pathinfo($file['name'],PATHINFO_EXTENSION);
	//拼接檔名
	$basename = $fileName.'.' . $ext;
	//拼接路徑
	$dest = $path.'/'. $basename;

	//將臨時資料夾中的檔案,移動到目標位置
	if(move_uploaded_file($tmp,$dest)){
		return $basename;
	}else{
		return 1010;
	}

}

//隨機檔案的格式	20171211152230asdfsd
function getRandName(){
	$string = date('YmdHis');
	for($i=0;$i<6;$i++){
		switch(mt_rand(0,2)){
			case 0:
				$string .= chr(mt_rand(97,122));   //小a
				break;
			case 1:
				$string .= chr(mt_rand(65,90));   //大A
				break;
			case 2:
				$string .= mt_rand(0,9);          //獲取隨機數
				break;
		}
	}
	return $string;
}

//使用者
$path = "e:/uploads";
$maxsize = 1024*1024*5;
$mime = ['image/jpeg','image/jpg','image/pjpeg','image/png'];
$file = $_FILES['image'];

$return = uploads($file,$mime,$maxsize,$path);
echo $return;
這裡主要做的是圖片的上傳。效果圖如下: