Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:编辑器的智能提示很方便,但不能过于依赖和相信,毕竟代码是人在写, 而不机器, 编辑器生成的代码仅供参考而已
超全局变量$_FILES
它也是以数组形式展现,主要是提现了上传文件的一些基础信息
图
里面键名大概意思name
文件名
type
文件类型
tmp_name
临时存储位置
error
错误提示
size
文件大小
move_uploaded_file()
把上传文件从临时文件夹移动到指定位置存放
例
<?php
//获取文件名
$fileName = $_FILES['user_pic']['name'];
//获取到后缀名
$extension = pathinfo($fileName)['extension'];
//临时存储地址
$tmpName = $_FILES['user_pic']['tmp_name'];
//指定存储地址,注意最后要拼接上后缀名,不然存储进去的没有后缀名
$destName = 'upload/' . $_FILES['user_pic']['name'] . '.' . $extension;
move_uploaded_file($tmpName,$destName);
is_uploaded_file()
检测是否通过POST方式上传文件
例
<?php
//临时存储地址
$tmpName = $_FILES['user_pic']['tmp_name'];
is_uploaded_file($tmpName);
HTML代码
<!-- 传输方式必须是POST -->
<form action="demo3.php" method="post" enctype="multipart/form-data">
<fieldset>
<legend>文件上传</legend>
<input type="file" name="user_pic">
<button>上传</button>
</fieldset>
</form>
PHP代码
<?php
// print_r($_FILES);
// echo '<hr>';
// echo $fileName;
// echo '<hr>';
// echo $extension;
// echo '<hr>';
// echo $tmpName;
//设置错误信息提示
//判断上传文件的合法性
try {
$error = $_FILES['user_pic']['error'];
if ($error > UPLOAD_ERR_OK) {
switch ($error) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_PARTIAL:
throw new Exception('文件上传不完整');
break;
case UPLOAD_ERR_NO_FILE:
throw new Exception('文件没有被上传');
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new Exception('未找到临时文件夹');
break;
case UPLOAD_ERR_CANT_WRITE:
throw new Exception('文件写入失败');
break;
default:
throw new Exception('其他未知错误');
}
}
// 获取上传文件原始名字
$fileName = $_FILES['user_pic']['name'];
//获取临时存储地址
$tmpName = $_FILES['user_pic']['tmp_name'];
//获取上传文件后缀
$extension = pathinfo($fileName)['extension'];
//创建文件存储地址
$destName = 'upload/' . md5($fileName) . time() . '.' . $extension;
//判断上传渠道的合法性
//获取临时存储地址
if (true === is_uploaded_file($tmpName)) {
//判断文件类型
if ($extension === 'pdf') {
//把临时文件移动到指定文件夹存储
move_uploaded_file($tmpName, $destName);
echo '<script>alert("上传成功");location.href="form.html"</script>';
} else {
throw new Exception('文件类型错误');
}
} else {
throw new Exception('上传方法错误');
}
} catch (Exception $e) {
echo $e->getMessage();
}
多文件上传
PHP
<?php
//查看获取到的数据
print_r($_FILES);
echo '<hr>';
//把获取到的多个文件遍历出来,因为它和单个上传文件获取到的数据排列不太一样
// 创建一个空数组
$files = [];
foreach ($_FILES as $file) {
//这里判断$_FILES里面任意一个键,如果是数组就说明是多文件上传,就继续执行
if (is_array($file['name'])) {
for ($i = 0; $i < count($file['name']); $i++) {
//这里要注意,创建的是空数组,在这里,变量前不要忘记加[],不然数据只能拿到一组
$files[] = [
'name' => $file['name'][$i],
'type' => $file['type'][$i],
'tmp_name' => $file['tmp_name'][$i],
'error' => $file['error'][$i],
'size' => $file['size'][$i],
];
}
}
}
//获取到遍历后的数据,再次进行遍历,然后放进代码里面
foreach ($files as $file) {
try {
$error = $file['error'];
if ($error > UPLOAD_ERR_OK) {
switch ($error) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_PARTIAL:
throw new Exception('文件上传不完整');
break;
case UPLOAD_ERR_NO_FILE:
throw new Exception('文件没有被上传');
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new Exception('未找到临时文件夹');
break;
case UPLOAD_ERR_CANT_WRITE:
throw new Exception('文件写入失败');
break;
default:
throw new Exception('其他未知错误');
}
}
// 获取上传文件原始名字
$fileName = $file['name'];
//获取临时存储地址
$tmpName = $file['tmp_name'];
//获取上传文件后缀
$extension = pathinfo($fileName)['extension'];
//创建文件存储地址
//这里要注意,最后要把后缀名加上去,不然文件无法识别
$destName = 'upload/' . md5($fileName) . time() . '.' . $extension;
//创建一个数组,限定上传文件类型
$update = ['jpg', 'png', 'gif', 'jpeg'];
//判断上传渠道的合法性
//获取临时存储地址
if (true === is_uploaded_file($tmpName)) {
//判断文件类型
//in_array判断一个元素,是否在数组中,返回值为布尔值
if (in_array($extension, $update)) {
//把临时文件移动到指定文件夹存储
// move_uploaded_file($tmpName, $destName);
// echo '<script>alert("上传成功");location.href="form1.html"</script>';
} else {
throw new Exception('文件类型错误');
}
} else {
throw new Exception('上传方法错误');
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
<?php
namespace upload;
use Exception;
class UpLoad_Files
{
public $files;
public $date;
public function __construct($files)
{
$this->files = $files;
}
//把$_FILES传递进去
public function getFilter()
{
$this->date = [];
foreach ($this->files as $file) {
//这里判断$_FILES里面任意一个键,如果是数组就说明是多文件上传,就继续执行
if (is_array($file['name'])) {
for ($i = 0; $i < count($file['name']); $i++) {
//这里要注意,创建的是空数组,在这里,变量前不要忘记加[],不然数据只能拿到一组
$this->date[] = [
'name' => $file['name'][$i],
'type' => $file['type'][$i],
'tmp_name' => $file['tmp_name'][$i],
'error' => $file['error'][$i],
'size' => $file['size'][$i],
];
}
}
}
return $this->date;
}
public function getFiles()
{
foreach ($this->date as $file) {
try {
$error = $file['error'];
if ($error > UPLOAD_ERR_OK) {
switch ($error) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_PARTIAL:
throw new Exception('文件上传不完整');
break;
case UPLOAD_ERR_NO_FILE:
throw new Exception('文件没有被上传');
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new Exception('未找到临时文件夹');
break;
case UPLOAD_ERR_CANT_WRITE:
throw new Exception('文件写入失败');
break;
default:
throw new Exception('其他未知错误');
}
}
// 获取上传文件原始名字
$fileName = $file['name'];
//获取临时存储地址
$tmpName = $file['tmp_name'];
//获取上传文件后缀
$extension = pathinfo($fileName)['extension'];
//创建文件存储地址
//这里要注意,最后要把后缀名加上去,不然文件无法识别
$destName = 'upload/' . md5($fileName) . time() . '.' . $extension;
//创建一个数组,限定上传文件类型
$update = ['jpg', 'png', 'gif', 'jpeg'];
//判断上传渠道的合法性
//获取临时存储地址
if (true === is_uploaded_file($tmpName)) {
//判断文件类型
//in_array判断一个元素,是否在数组中,返回值为布尔值
if (in_array($extension, $update)) {
//把临时文件移动到指定文件夹存储
move_uploaded_file($tmpName, $destName);
echo '<script>alert("上传成功");location.href="form1.html"</script>';
} else {
throw new Exception('文件类型错误');
}
} else {
throw new Exception('上传方法错误');
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
public function getFile()
{
try {
$error = $this->files['user_pic']['error'];
if ($error > UPLOAD_ERR_OK) {
switch ($error) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('文件大小超过系统设置');
break;
case UPLOAD_ERR_PARTIAL:
throw new Exception('文件上传不完整');
break;
case UPLOAD_ERR_NO_FILE:
throw new Exception('文件没有被上传');
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new Exception('未找到临时文件夹');
break;
case UPLOAD_ERR_CANT_WRITE:
throw new Exception('文件写入失败');
break;
default:
throw new Exception('其他未知错误');
}
}
// 获取上传文件原始名字
$fileName = $this->files['user_pic']['name'];
//获取临时存储地址
$tmpName = $this->files['user_pic']['tmp_name'];
//获取上传文件后缀
$extension = pathinfo($fileName)['extension'];
//创建文件存储地址
$destName = 'upload/' . md5($fileName) . time() . '.' . $extension;
//创建一个数组,限定上传文件类型
$update = ['jpg', 'png', 'gif', 'jpeg'];
//判断上传渠道的合法性
//获取临时存储地址
if (true === is_uploaded_file($tmpName)) {
//判断文件类型
if (in_array($extension,$update)) {
//把临时文件移动到指定文件夹存储
move_uploaded_file($tmpName, $destName);
echo '<script>alert("上传成功");location.href="form.html"</script>';
} else {
throw new Exception('文件类型错误');
}
} else {
throw new Exception('上传方法错误');
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
<?php
namespace upload;
require 'UpLoad_Files.php';
class Factory
{
public static $obj;
//获取对象
public static function getObj($files)
{
self::$obj = new UpLoad_Files($files);
return self::$obj;
}
//多文件需要过滤数据
public static function getFilter()
{
return self::$obj->getFilter();
}
//获取多文件上传数据
public static function getFiles()
{
return self::$obj->getFiles();
}
//获取单个文件上传数据
public static function getFile()
{
return self::$obj->getFile();
}
}
//调用
Factory::getObj($_FILES);
//多文件上传需要先过滤数据
Factory::getFilter();
//获取多文件上传数据
Factory::getFiles();
//单个文件不用过滤数据,直接获取
Factory::getFile();
最后,吐槽下VS,使用USE引用的时候,它有时候要自动添加一个路径,导致引用失败,不知道是不是哪里没设置对- -,被坑了30分钟去找错误,结果发现是引用的问题