PHP文件上傳

經過 PHP,能夠把文件上傳到服務器。php

1. 建立一個文件上傳表單

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<form action="file.php" method="post" enctype="multipart/form-data">
		<input type="file" name="chencheng">
		<button type="submit">上傳</button>
</body>
</html>

將以上代碼保存到 file.html 文件中。html

有關上面的 HTML 表單的一些注意項列舉以下:數組

  • <form> 標籤的 enctype 屬性規定了在提交表單時要使用哪一種內容類型。在表單須要二進制數據時,好比文件內容,請使用 "multipart/form-data"表示不對字符編碼。
  • <input> 標籤的 type="file" 屬性規定了應該把輸入做爲文件來處理。舉例來講,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。

註釋:容許用戶上傳文件是一個巨大的安全風險。請僅僅容許可信的用戶執行文件上傳操做。瀏覽器

2. 建立上傳腳本

注意:安全

$_FILES["file"]["error"] =0 表示文件上傳成功!!
$_FILES["file"]["error"] =1上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值.
$_FILES["file"]["error"] =2上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
$_FILES["file"]["error"] =3文件只有部分被上傳
$_FILES["file"]["error"] =4沒有文件被上傳
$_FILES["file"]["error"]>0 表示文件上傳錯誤!!!服務器

file.php函數

<?php
    if($_FILES["chencheng"]["error"] > 0){
        echo "錯誤:".$_FILES["chencheng"]["error"]."<br>"
    } else {
               echo "上傳文件名爲:".$_FILES["chencheng"]["name"]."<br>"
               echo "文件類型:".$_FILES["chencheng"]["type"]."<br>"
               echo "文件大小:".$_FILES["chencheng"]["size"]."<br>"
               echo "文件臨時存儲的位置:".$_FILES["chencheng"]["tmp_name"]."<br>"
           }
     
?>

經過使用 PHP 的全局數組 $_FILES,你能夠從客戶計算機向遠程服務器上傳文件。post

第一個參數是表單的 input name,第二個下標能夠是 "name"、"type"、"size"、"tmp_name" 或 "error"。以下所示:編碼

$_FILES["file"]["name"] - 上傳文件的名稱spa

$_FILES["file"]["type"] - 上傳文件的類型

$_FILES["file"]["size"] - 上傳文件的大小,以字節計

$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱即位置

$_FILES["file"]["error"] - 由文件上傳致使的錯誤代碼

這是一種很是簡單文件上傳方式。基於安全方面的考慮,您應當增長有關容許哪些用戶上傳文件的限制。

上傳限制

在這個腳本中,咱們增長了對文件上傳的限制。用戶只能上傳 .gif、.jpeg、.jpg、.png 文件,文件大小必須小於 200 kB:

<?php
    $allowedExts = array("gif","jpeg","jpg","png");
	$tmp = explode(".",$_FILES["file"]["name"]);
	$extension = end($tmp);
	var_dump($extension);// 獲取文件後綴名
	if ((($_FILES["file"]["type"] == "image/gif")
	|| ($_FILES["file"]["type"] == "image/jpeg")
	|| ($_FILES["file"]["type"] == "image/jpg")
	|| ($_FILES["file"]["type"] == "image/pjpeg")
	|| ($_FILES["file"]["type"] == "image/x-png")
	|| ($_FILES["file"]["type"] == "image/png"))
	&& ($_FILES["file"]["size"] < 204800)    // 小於 200 kb
	&& in_array($extension, $allowedExts)) {
		if ($_FILES["file"]["error"] > 0)
		{
		    echo "錯誤:" . $_FILES["file"]["error"] . "<br>";
		}
		else
		{
		    echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
		    echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
		    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
		    echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"];
		}
	}
	else
	{
		echo "非法的文件格式";
	}


?>

4. 保存被上傳的文件

上面的實例在服務器的 PHP 臨時文件夾中建立了一個被上傳文件的臨時副本。

這個臨時的副本文件會在腳本結束時消失。要保存被上傳的文件,咱們須要把它拷貝到另外的位置:

<?php

	$allowedExts = array("gif","jpeg","jpg","png");
	$tmp = explode(".",$_FILES["file"]["name"]);
	$extension = end($tmp);// 獲取文件後綴名
	if ((($_FILES["file"]["type"] == "image/gif")
	|| ($_FILES["file"]["type"] == "image/jpeg")
	|| ($_FILES["file"]["type"] == "image/jpg")
	|| ($_FILES["file"]["type"] == "image/pjpeg")
	|| ($_FILES["file"]["type"] == "image/x-png")
	|| ($_FILES["file"]["type"] == "image/png"))
	&& ($_FILES["file"]["size"] < 204800)    // 小於 200 kb
	&& in_array($extension, $allowedExts)) {
		if ($_FILES["file"]["error"] > 0)
		{
		    echo "錯誤:" . $_FILES["file"]["error"] . "<br>";
		}
		else
		{
		    echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
		    echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
		    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . "kB<br>";
		    echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"]. "<br>";
		    if ( file_exists("upload/".$_FILES["file"]["name"]) ) {
		    	echo $_FILES["file"]["name"]."文件已經存在";
		    }
		    else {
		    	move_uploaded_file( $_FILES["file"]["tmp_name"],"upload/".$_FILES["file"]["name"] );
		    	echo "文件儲存在:"."upload/".$_FILES["file"]["name"];
		    }
		}
	}
	else
	{
		echo "非法的文件格式";
	}
?>

如何解決兩個不一樣的用戶上傳了一個名稱相同的文件、圖片而產生了相同文件保存路徑這個問題呢?

<?php
	
	$allowedExts = array("gif","jpeg","jpg","png");
	$tmp = explode(".",$_FILES["file"]["name"]);
	$extension = end($tmp);// 獲取文件後綴名
	if ((($_FILES["file"]["type"] == "image/gif")
	|| ($_FILES["file"]["type"] == "image/jpeg")
	|| ($_FILES["file"]["type"] == "image/jpg")
	|| ($_FILES["file"]["type"] == "image/pjpeg")
	|| ($_FILES["file"]["type"] == "image/x-png")
	|| ($_FILES["file"]["type"] == "image/png"))
	&& ($_FILES["file"]["size"] < 204800)    // 小於 200 kb
	&& in_array($extension, $allowedExts)) {
		if ($_FILES["file"]["error"] > 0)
		{
		    echo "錯誤:" . $_FILES["file"]["error"] . "<br>";
		}
		else
		{
		    echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
		    echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
		    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . "kB<br>";
		    echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"]. "<br>";

		    $upload_path = "upload/.".time().rand().".".end($tmp);
	    	move_uploaded_file( $_FILES["file"]["tmp_name"],$upload_path );
	    	echo "文件儲存在:".$upload_path;
		}
	}
	else
	{
		echo "非法的文件格式";
	}
?>

以上操做中用到的PHP函數總結:

1. rand()

2. end(),current();

3.file_exsits()

4.explode()

相關文章
相關標籤/搜索