网站构建四(文件上传与查询)

上传文件的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!="..")


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