在项目实践中再次遇到这个这个功能的开发,重新温习了一遍,把代码注释详细得写出来了。发现这种总结式的学习方法还是会比较有效对吧,以后忘了能再回头来看看=.=
直接上代码
主要的html代码:
(要注意在上传文件时,form的enctype定义MIME编码,以二进制数据的形式上传)
<body>
<form method="post" enctype="multipart/form-data" >
<input type="file" name="file">
<input type="submit" name="sm" value="上传">
</form>
</body>
php动态实现代码:
if(isset($_POST['sm'])){
//var_dump($_FILES['file']);
foreach($_FILES['file'] as $key => $value){
$$key = $value ;
//echo "$$key "."$key "."$value ";
}
if($error){
echo "<script> alert ('文件上传出错!')</script>";
exit;
}
if($type!='image/jpeg' && $type!='image/png' ){
echo "<script> alert ('文件类型有错!')</script>";
exit;
}
$reasult=move_uploaded_file($tmp_name,'./upload/'.$name);
if($reasult){
$dst_w=52; //目标图片的宽
$dst_h=42; //目标图片的长
$dst_image=imagecreatetruecolor ($dst_w , $dst_h ) ;
$src_image=imagecreatefromjpeg('./upload/'.$name);
$dst_x=0; //目标图片的起始x坐标
$dst_y=0; //目标图片的起始y坐标
$src_x=0;//源图片的起始x坐标
$src_y=0;//源图片的起始y坐标
$src=getimagesize('./upload/'.$name); //获取源图片大小,以数组方式返回宽高等信息,具体用var_damp()输出查看
//var_dump($src);
$src_w=$src[0];
$src_h=$src[1];
imagecopyresampled ( $dst_image , $src_image , $dst_x , $dst_y ,$src_x , $src_y , $dst_w , $dst_h , $src_w , $src_h );
$newfile='./upload/thumb/'.$name;
imagejpeg($dst_image, $newfile, 100);
imagedestroy($dst_image );
imagedestroy($src_image ); //释放和暂存图片的内存
echo "<a href='./upload/{$name}'><img src='./upload/thumb/{$name}'></a>";
}else{
echo"<script> alert ('文件上传失败!')</script>";
}
}
总结下下:
涉及的点:
- $_FILES[‘file’]
$_FILES[]是一个二维数组,因此_FILES[‘file’]是一个一位数组,其中包含的都是上传文件的属性值,而且这些描述属性的变量名是固定的,包括:name:文件名,type:文件类型,tmp_name:临时存放的绝对路径,error:是否上传出错,size:文件大小 - foreach($_FILES[‘file’] as $key => $value)
我们知道在PHP中有两种数组,一种是索引数组,一种是关联数组,它们们的差别就在于,前者的下标是数字,后者的下标是字符串。而foreach循环则通常使用在下标是字符串的情况下
其次,括号中是将数组作为键名和键值对应的方法,依次循环取 - $$key = $value ;
$key为键名,$value为键值,$($key)则是将键名作为字符与$组成一个变量名,再讲值赋给这个变量,这样我们使用起来就很方便,我们使用在表单中各个控件的name值取用户的输入
核心函数:
- move_uploaded_file($tmp_name,’./upload/’.$name)
将上传的图片从暂存的地址(绝对路径)转移到自定义的路径下 - imagecreatetruecolor ($dst_w , $dst_h )
生成一块空间暂时存放我们的缩略图,参数是这块图的宽高 - imagecreatefromjpeg(‘./upload/’.$name);
把用户上传的图片通过这个函数暂时存放到一块内存中,返回一图像标识符 - imagecopyresampled($dst_image , $src_image , $dst_x , $dst_y ,$src_x , $src_y , $dst_w , $dst_h , $src_w , $src_h );
主要的切割函数,平滑地生成的新图片中插入像素值,能比较好地保持图片原本的清晰度 - imagejpeg($dst_image, $newfile, 100);
将 dst_image 图像以 newfile 为文件名创建一个 JPEG 图像,图片质量是100(最高)(类似于把生成好的缩略图从内存中取出,存储起来)