網站構建四(文件上傳與查詢)

上傳文件的HTML表單:

<form id='sign' method='post' action='upload.php' enctype='multipart/form-data'>
	<h2>Choose the file to sign:</h2>
    <input type='hidden' name='MAX_FILE_SIZE' value='1000000' />
        <label for='userfile'>Upload a file:</label>
        <input type='file' name='userfile' id='userfile' />
        <input type='submit' value='Send File' />
</form>

有兩個需要注意的地方:

  1. 在<form>標記中,必須設置屬性enctype="multipart/form-data",這樣,服務器就可以知道上傳的文件帶有常規的表單信息。
  2. 必須有一個可以設置上傳文件最大長度的表單域。這是一個隱藏域,如下所示:
<input type='hidden' name='MAX_FILE_SIZE' value='1000000' />

MAX_FILE_SIZE表單域是可選的,該值也可以在服務器端設置。然而,如果在這個表單中使用,表單域的名稱必須爲MAX_FILE_SIZE。

從HTML表單中獲得文件的PHP腳本:

<?php
	
	if($_FILES['userfile']['error']>0){
		echo 'Problem:';
		switch($_FILES['userfile']['error']){
			case 1:echo 'File exceeded upload_max_filesize';
							break;
			case 2:echo 'File exceeded max_file_size';
							break;
			case 3:echo 'File only partially uploaded';
							break;
			case 4:echo 'No file uploaded';
							break;
			case 6:echo 'Cannot upload file:No temp directory specified';
							break;
			case 7:echo 'Upload failed:Cannot write to disk';
							break;
		}
		exit;
	}
	
	if($_FILES['userfile']['type']!='text/plain'){
		echo 'Problem:file is not plain text';
		exit;
	}
	
	$upfile='/uploads/'.$_FILES['userfile']['name'];
	
	if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
		if(!move_uploaded_file($_FILES['userfile']['tmp_name'],$upfile)){
			echo 'Problem:Could not move file to destination directory';
			exit;
		}
	}
	else{
		echo 'Problem:Possible file upload attack.Filename:';
		echo $_FILES['userfile']['name'];
		exit;
	}
	
	echo 'File uploaded successfully<br><br>';
	
	$contents=file_get_contents($upfile);
	$contents=strip_tags($contents);
	file_put_contents($_FILES['userfile']['name'],$contents);
	
	echo '<p>Preview of uploaded file contents:<br/><hr/>';
	echo nl2br($contents);
	echo '<br /><hr/>';
?>

  • 存儲在$_FILES['userfile']['tmp_name']變量中的值就是文件在web服務器中臨時存儲的位置。
  • 存儲在$_FILES['userfile']['name']變量中的值就是用戶系統中的文件名稱。
  • 存儲在$_FILES['userfile']['size']變量中的值就是文件的字節大小。
  • 存儲在$_FILES['userfile']['type']變量中的值就是文件的MIME類型,例如:text/plain或者image/gif。
  • 存儲在$_FILES['userfile']['error']變量中的值將是任何與文件上傳相關的錯誤代碼。
如果已經知道上傳文件的位置及名稱,就可以將其複製到其他有用的地方。在腳本執行結束前,這個臨時文件將被刪除。因此,如果想要保留上傳文件,必須將其重命名或者移動。

以上腳本主要進行的操作是錯誤檢測,文件上傳存在潛在的安全風險,因此要儘量避免這些安全風險。

$_FILE['userfile']['error']中返回的錯誤代碼:

  • UPLOAD_ERROR_OK,值爲0,表示沒有發生任何錯誤。
  • UPLOAD_ERR_INI_SIZE,值爲1,表示上傳文件的大小超出了約定值。文件大小的最大值是在PHP配置文件中指定的,該指令是upload_max_filesize。
  • UPLOAD_ERR_FORM_SIZE,值爲2,表示上傳文件的大小超出了HTML表單的MAX_FILE_SIZE元素所指定的最大值。
  • UPLOAD_ERR_PARTIAL,值爲3,表示文件只被部分上傳。
  • UPLOAD_ERR_FILE,值爲4,表示沒有上傳文件。
  • UPLOAD_ERR_DIR,值爲6,表示在php.ini文件中沒有指定臨時目錄。
  • UPLOAD_ERR_CANT_WRITE,值爲7,表示將文件寫入磁盤失敗。

使用scandir()函數對文件名稱進行字母表方式排序:

<?php
$dir='/uploads/';
$files1=scandir($dir);
$files2=scandir($dir,1);

echo "<p>Upload directory is $dir</p>";
echo '<p>Directory Listing in alphabetical order,ascending:</p><ul>';

foreach($files1 as $file){
	if($file!="." &&$file!=".."){
		echo "<li>$file</li>";
	}
}

echo '</ul>';

echo "<p>Upload directory is $dir</p>";
echo '<p>Directory Listing in alphabetical,descending:</p><ul>';

foreach($files2 as $file){
	if($file!="." &&$file!=".."){
		echo "<li>$file</li>";
	}
}

echo '</ul>';
?>

scandir()函數可以將文件名稱保存在一個數組,並且以字母表的順序排序,升序或者降序。

通常,.(當前目錄)和..(上級目錄)也會顯示在清單中。但是,使用瞭如下代碼,把它們過濾了:

<span style="white-space:pre">	</span>if($file!="." &&$file!="..")


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章