上传文件的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>
有两个需要注意的地方:
- 在<form>标记中,必须设置属性enctype="multipart/form-data",这样,服务器就可以知道上传的文件带有常规的表单信息。
- 必须有一个可以设置上传文件最大长度的表单域。这是一个隐藏域,如下所示:
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!="..")