

10/30
2016
最近在看php的教程,算是知道用php上传文件是怎么回事了。
首先是html代码:
1 2 3 4 | < form action = "t.php" method = "post" enctype = "multipart/form-data" > < input type = "file" name = "file" > < input type = "submit" > </ form > |
form表单的enctype="multipart/form-data"属性是上传文件时必须的,它表示以二进制的数据格式来传输文件。
后台php代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php header( "Content-type:text/html;charset=utf-8" ); 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" ]; //移动文件到指定位置 move_uploaded_file( $_FILES [ "file" ][ "tmp_name" ], __DIR__ . "/" . $_FILES [ "file" ][ "name" ]); } ?> |
$_FILES存储各种与上传文件有关的信息。它的第一个的键名如"file"是文件上传框的name。第二个键名是上传文件的各项信息,如下:
1 2 3 4 5 | $_FILES["file"]["name"] - 上传文件的名称 $_FILES["file"]["type"] - 上传文件的类型 $_FILES["file"]["size"] - 上传文件的大小,以字节计 $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称 $_FILES["file"]["error"] - 由文件上传导致的错误代码 |
因为数据是以二进制形式上传的,所以当文件上传完毕之后,文件是存储在临时目录中的一个tmp文件,路径如"D:\wamp\tmp\phpFFB5.tmp"。所以在最后我们需要使用php内置的函数move_uploaded_file()将文件移动到指定位置,完成存储。
当然了,在生产环境中,上传文件不可能不进行验证。
在前台,我们可以使用JavaScript来获取要上传的文件的属性,如name、size、type、lastModified等。这些属性可以让我们在前台做出验证。这个可以参考《修改表单中file控件的外观》一文或者再去搜索。
在后台,php中$_FILES中也可以获取上传文件的各项属性,上面也已经讲过了。这里我偷懒直接贴个现成的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?php // 允许上传的图片后缀 $allowedExts = array ( "gif" , "jpeg" , "jpg" , "png" ); $temp = explode ( "." , $_FILES [ "file" ][ "name" ]); $extension = end ( $temp ); // 获取文件后缀名 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 "非法的文件格式" ; } ?> |
由于上传木马可以上多后缀的 所以一定要锁定于单后缀
比如 1.php.jpg
什么的