PHP100 上传文件
一、知识点
1. form 标签的 enctype 属性值
默认情况的编码格式是 application/x-www-form-urlencoded,不能用于文件上传
<form action="" enctype="multipart/form-data" method="post" name="upform"> 上传文件: <input name="upfile" type="file"> <input type="submit" name="sub" value="上传"> </form>
因为上传文件的时候是二进制编码,必须的要使用 enctype="multipart/form-data" 的编码格式,才能完整的传递文件数据
意思将表单内容设置成 MIME 编码,它是一种二进制的编码
input 要使用 type="file" 文件类型
2. $_FILES 系统函数
$_FILES 函数接收上传文件的内容,将上传的内容转为我们所需的数组,
它类似于 $_POST 和 $_GET 函数,都是接收表单传递过来的内容,区别 $_FILES 是将表单上传的内容转换成一个数组
几个重要的键值
$_FILES['upfile']['name'] 客户端上传文件的名称(原名)
$_FILES['upfile']['type'] 文件MIME类型,可以从服务器端严格的限制文件类型
$_FILES['upfile']['size'] 当前上传文件的大小,单位是字节。可以限制上传的文件大小
$_FILES['upfile']['tmp_name'] 储存的临时文件名,一般是系统默认。后面将临时文件移动到我们所需要的位置
$_FILES['upfile']['error'] 当前上传文件相关错误代码
通过 MIME 限制上传的文件类型
image/jpg
image/jpeg
image/png
image/pjpeg
image/gif
image/bmp
image/x-png
application/x-zip-compressed
...
$_FILES['upfile']['error'] 的错误信息
0 文件上传成功
1 超过系统限制的文件大小,可以在php.ini文件中配置
2 超过了文件大小,MAX_FILE_SIZE 选项指定的值
3 文件只有部分被上传
4 没有文件被上传,没有上传成功返回4
5 上传文件大小为0,比如上传文件本身就 0k 返回为5
3. move_uploaded_file(临时文件, 目标位置和文件名)
上传后,文件放在服务器的临时文件夹中,该函数把文件移动到我们需要的位置,移动的文件可以重命名
4. is_uploaded_file 函数
判断上传 MIME 类型的文件函数,判断上传的文件是否成功了
二、示例
主要的就三步
1. from表单元素的 enctype属性设置为 enctype="multipart/form-data"
input框为上传类型 type="file",要设置 name 属性
2. $_FILES['upfile'] 接收表单内容是一个数组,upfile是上面name属性的值,
其实到这已经上传成功了,只是上传的文件在临时文件夹中 $_FILES['upfile']['tmp_name']
3. move_uploaded_file(临时文件, 目标位置和文件名) 把在临时文件夹中的上传文件,移动到响应的位置
课程代码
<?php if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ // 首先判断上传的临时文件是否成功了 $upfile = $_FILES["upfile"]; // 获取的是一个数组,upfile是input框name的值 $name = $upfile["name"]; $type = $upfile["type"]; $size = $upfile["size"]; // 大小的单位是字节,1024进位,比如105542有150k左右 $tmp_name = $upfile["tmp_name"]; // 这个时候文件已经上传成功了,只是放在了临时文件夹中 $error = $upfile["error"]; switch($type){ case 'image/pjpeg' : $ok=1; break; case 'image/jpeg' : $ok=1; break; case 'image/gif' : $ok=1; break; case 'image/png' : $ok=1; break; } if($ok && $error=='0'){ move_uploaded_file($tmp_name, 'uploads/'.$name); // 把上传的文件移动到我们需要的位置 echo "上传成功"; } } ?> <form action="" enctype="multipart/form-data" method="post" name="upform"> 上传文件: <input name="upfile" type="file"> <input type="submit" value="上传"><br> </form>
自己练习写一个函数,需要在PHP文件同级目录,建一个 uploads 文件夹
<?php // error_reporting(E_ALL & ~E_NOTICE); $_POST['sub'] = isset($_POST['sub'])? $_POST['sub'] : null; if($_POST['sub']){ $result = up_file('uploads', 'upfile'); if($result){ echo '上传成功'; }else if($result == 0){ echo '没有选择上传的文件'; } } function up_file($load = 'uploads', $fileName = 'file'){ $up = $_FILES[$fileName]; $name = $up["name"]; $type = $up["type"]; $size = $up["size"]; $tmp_name = $up["tmp_name"]; $error = $up["error"]; if(!is_uploaded_file($tmp_name)){ return 0; // 没有上传文件 exit; } if(move_uploaded_file($tmp_name, './'. $load. '/img' .time().'.jpg')){ return true; } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>文件上传</title> </head> <body> <form enctype="multipart/form-data" action="" method="post"> <input type="file" name="upfile"> <input type="submit" name="sub" value="上传"> </form> </body> </html>
PHP100课程文件包中的代码,功能比较完善,注释风格清晰
<?php /************************************************************ 参数说明: $max_file_size : 上传文件大小限制, 单位BYTE $destination_folder : 上传文件路径 $watermark : 是否附加水印(1为加水印,其他为不加水印); 使用说明: 1. 将PHP.INI文件里面的"extension=php_gd2.dll"一行前面的;号去掉,因为我们要用到GD库; 2. 将extension_dir =改为你的php_gd2.dll所在目录; ************************************************************/ //上传文件类型列表 $uptypes=array( 'image/jpg', 'image/jpeg', 'image/png', 'image/pjpeg', 'image/gif', 'image/bmp', 'image/x-png' ); $max_file_size=2000000; //上传文件大小限制, 单位BYTE $destination_folder="uploadimg/"; //上传文件路径 $watermark=1; //是否附加水印(1为加水印,其他为不加水印); $watertype=1; //水印类型(1为文字,2为图片) $waterposition=1; //水印位置(1为左下角,2为右下角,3为左上角,4为右上角,5为居中); $waterstring="http://www.xplore.cn/"; //水印字符串 $waterimg="xplore.gif"; //水印图片 $imgpreview=1; //是否生成预览图(1为生成,其他为不生成); $imgpreviewsize=1/2; //缩略图比例 ?> <html> <head> <title>ZwelL图片上传程序</title> <style> body{font-size: 9pt;} input{background-color: #66CCFF;border: 1px inset #CCCCCC;} </style> </head> <body> <form enctype="multipart/form-data" method="post" name="upform"> 上传文件: <input name="upfile" type="file"> <input type="submit" value="上传"><br> 允许上传的文件类型为:<?=implode(', ',$uptypes)?> </form> <?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ //是否存在文件 if (!is_uploaded_file($_FILES["upfile"][tmp_name])){ echo "图片不存在!"; exit; } $file = $_FILES["upfile"]; //检查文件大小 if($max_file_size < $file["size"]){ echo "文件太大!"; exit; } //检查文件类型 if(!in_array($file["type"], $uptypes)){ echo "文件类型不符!".$file["type"]; exit; } if(!file_exists($destination_folder)){ mkdir($destination_folder); } $filename=$file["tmp_name"]; $image_size = getimagesize($filename); $pinfo=pathinfo($file["name"]); $ftype=$pinfo['extension']; $destination = $destination_folder.time().".".$ftype; if (file_exists($destination) && $overwrite != true){ echo "同名文件已经存在了"; exit; } if(!move_uploaded_file ($filename, $destination)){ echo "移动文件出错"; exit; } $pinfo=pathinfo($destination); $fname=$pinfo[basename]; echo " <font color=red>已经成功上传</font><br>文件名: <font color=blue>".$destination_folder.$fname."</font><br>"; echo " 宽度:".$image_size[0]; echo " 长度:".$image_size[1]; echo "<br> 大小:".$file["size"]." bytes"; if($watermark==1){ $iinfo=getimagesize($destination,$iinfo); $nimage=imagecreatetruecolor($image_size[0],$image_size[1]); $white=imagecolorallocate($nimage,255,255,255); $black=imagecolorallocate($nimage,0,0,0); $red=imagecolorallocate($nimage,255,0,0); imagefill($nimage,0,0,$white); switch ($iinfo[2]){ case 1: $simage =imagecreatefromgif($destination); break; case 2: $simage =imagecreatefromjpeg($destination); break; case 3: $simage =imagecreatefrompng($destination); break; case 6: $simage =imagecreatefromwbmp($destination); break; default: die("不支持的文件类型"); exit; } imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]); imagefilledrectangle($nimage,1,$image_size[1]-15,80,$image_size[1],$white); switch($watertype){ case 1: //加水印字符串 imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black); break; case 2: //加水印图片 $simage1 =imagecreatefromgif("xplore.gif"); imagecopy($nimage,$simage1,0,0,0,0,85,15); imagedestroy($simage1); break; } switch ($iinfo[2]){ case 1: //imagegif($nimage, $destination); imagejpeg($nimage, $destination); break; case 2: imagejpeg($nimage, $destination); break; case 3: imagepng($nimage, $destination); break; case 6: imagewbmp($nimage, $destination); //imagejpeg($nimage, $destination); break; } //覆盖原上传文件 imagedestroy($nimage); imagedestroy($simage); } if($imgpreview==1){ echo "<br>图片预览:<br>"; echo "<img src=\"".$destination."\" width=".($image_size[0]*$imgpreviewsize)." height=".($image_size[1]*$imgpreviewsize); echo " alt=\"图片预览:\r文件名:".$destination."\r上传时间:\">"; } } ?> </body>
三、上传接口
配合前端学习,写了一个ajax 上传文件的接口
<?php error_reporting(E_ALL & ~E_NOTICE); // error_reporting(0); header("Access-Control-Allow-Origin: http://127.0.0.1:8848"); header("Access-Control-Allow-Methods: POST"); header("Access-Control-Allow-Headers: content-type, a"); // 限制上传体积 if ($_SERVER['CONTENT_LENGTH'] > 1024*1024){ echo '{"code":1, "msg":"上传文件大小超过限制", "data":null }'; exit(); } $upfile = $_FILES["upfile"]; $name = $upfile["name"]; $type = $upfile["type"]; $size = $upfile["size"]; $tmp_name = $upfile["tmp_name"]; $error = $upfile["error"]; if($tmp_name){ // 上传失败 if ($error != 0){ echo '{"code":1, "msg":"上传文件失败", "data":null }'; exit(); } // 限制上传文件必须是图片 $typeArr = ['image/pjpeg', 'image/jpeg','image/gif','image/png']; if(!in_array($type, $typeArr)){ echo '{"code":1, "msg":"上传文件不是图片格式", "data":null }'; exit(); } // 上传图片重命名 $Suffix = explode('/', $type)[1]; $Suffix = $Suffix == 'jpeg'? 'jpg': $Suffix; $pathname = 'uploads/pic_'.mt_rand(1000, 100000).'_'.time().'.'.$Suffix; // 移动文件到指定位置,并返回响应结果 if(move_uploaded_file($tmp_name, $pathname)){ $result = 'http://localhost/mycode/ajax_upload/'.$pathname; echo '{"code":0, "msg":"", "data": {"path": "'.$result.'"}}'; } } // echo $_SERVER['PHP_SELF']; // Array ( [name] => 1995年Cosplay.jfif [type] => image/jpeg [tmp_name] => D:\xampp\tmp\phpF267.tmp [error] => 0 [size] => 32768 ) {"path": "http://localhost/mycode/uploads/1995年Cosplay.jfif"} ?>