批改状态:合格
老师批语:福根的作业注释很详细, 是我课上的内容, 也可以尝试横向了解一下相关知识, 可参考周同学的博客
作业:文件上传,封装一个单文件上传的函数
<?php// 一. 上传表单enctype属性应设置说明:// enctype="multipart/form-data"// multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。// 需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,// 只有使用了multipart/form-data,才能完整的传递文件数据。?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>单文件上传</title></head><body><form action="demo2.php" method="post" enctype="multipart/form-data"><fieldset><legend>单文件上传</legend><input type="file" name="my_file"><button>上传</button></fieldset></form></body></html>
<?php// 上传文件的描述信息,全部保存在系统全局变量`$_FILES`中,包括:// name文件在客户端的原始文件名// type文件的 MIME 类型, 由浏览器提供// tmp_name 文件被上传到服务器上之后,在临时目录中临时文件名// error 文件上传相关的错误代码// size 已上传文件的大小function upload(array $fileInfo,$uploadPath="uploads",$flag = true,$allowExt=['jpg','jpeg','png','wbmp','gif'],$maxSize=2097152){// 防止文件重名产生覆盖$fileRealPath = $path.md5($prefix.time()).'.'.$ext;// 判断文件上传是否出错if( $fileInfo['error'] != 0){return false;}//检验图片是否真实// getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息if($flag){if(!getimagesize($fileInfo['tmp_name'])){die('不是真实图片,get out~');}}// 判断文件大小是否合规if($fileInfo['size'] > $maxSize){die('文件大小超过限制的最大值~');}// 拿到文件后缀:explode() 函数把字符串打散为数组。array_pop() 函数删除数组中的最后一个元素。in_array() 函数搜索数组中是否存在指定的值$ext = array_pop(explode('.',$fileInfo['name'])) ;// 判定上传的文件类型是否合规if(!in_array($ext,$allowExt)){die('非法的文件类型');}// is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的if(!is_uploaded_file($fileInfo['tmp_name'])){die('上传方式错误:请使用http post方式上传');}// 原始图片的前缀,防止文件重名产生覆盖 ,文件真正储存的位置$prefix = array_shift(explode('.',$fileInfo['name'])) ;// 判断目录是否存在,如果不存在创建,并且设置权限if(!file_exists($uploadPath)){//允许全局访问mkdir($uploadPath,0777,true);chmod($uploadPath,0777);}// 定义文件移动后在名称$fileRealPath = $uploadPath.'/'.md5($prefix.time()).'.'.$ext;// 判断文件是否上传(移动)成功// move_uploaded_file — 将上传的文件移动到新位置if (!move_uploaded_file($fileInfo['tmp_name'],$fileRealPath)){die('文件上传失败');}//返回文件路径return $fileRealPath;}
<?php// 二. 作为后端程序员,对用户上传的文件(比如:图片)限制项:// 1、文件是否真实// 2、文件大小超过限制的最大值// 3、非法的文件类型// 4、上传方式:需要使用http post方式上传// 5、文件是否上传成功// 三. 案例:封装一个适合(单)文件上传的函数:// 1、require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。// 2、常量__DIR__,指向当前执行的PHP脚本所在的目录。// 3、DIRECTORY_SEPARATOR是一个显示系统分隔符的命令,DIRECTORY_SEPARATOR是PHP的内部常量,不需要任何定义与包含即可直接使用require_once __DIR__ . DIRECTORY_SEPARATOR . 'lib'. DIRECTORY_SEPARATOR . 'libtext.php';$fileInfo = $_FILES['my_file'];$newName = upload($fileInfo,'storages/uploads');echo $newName;// 输出结果:storages/uploads/e14d94cc10e2af8eaedc5be515078ea0.jpg

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号