文件上传基本有两种:使用表单同步上传,使用js异步上传。第一种方式代码简单,但体验性较差,适合小文件的上传。
本篇文章主要介绍使用thinkphp5实现表单上传文件
有关详细资料可能参见tp5完全开发手册“杂项-上传”
第一步:处理好前端的表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="{:url('upload')}" enctype="multipart/form-data" method="post">
<div><input type="file" name="file"/></div>
<div><input type="submit" value="上传"/></div>
</form>
</body>
</html>
使用form表单上传文件时,必须有属性:enctype="multipart/form-data"
另外,还要使用<input type="file" name="file"/>
接下来,就是控制器的代码:
<?php
namespace app\index\controller;
use think\Controller;
class Upload extends Controller
{
//显示页面
public function index()
{
return $this->fetch();
}
//上传文件
public function upload()
{
$file = request()->file('file');
if(empty($file)){
$this->error('上传文件失败,估计是文件大小超过' . ini_get('upload_max_filesize'));
}
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
echo '上传文件成功';
}else{
$this->error('上传文件失败' . $file->getError());
}
}
}
我们来看upload()方法中 的第一行代码:$file = request()->file('file');
request()是tp5的助手函数,可以获取request对象,file()方法中的参数‘file' 一定要和表单中 input 的name值一样,如:
<input type="file" name="file"/>
如果选择上传的文件过大(一般超过2M),就会上传失败,当执行到 $file = request()->file('file') 代码时,得到的结果是null,所以我们一定要使用判断语句 if(empty($file))
接下来,我们讲解下面这条指令 ini_get('upload_max_filesize')
它可以获取pho.ini配置文件中上传文件的最大值是多少
php默认的上传文件最大2M,我们通过修改php.ini可以实现上传更大的文件。
在php.ini中找到:upload_max_filesize 的关键字
就会发现:upload_max_filesize = 2M
表示最大为2M,你可以将2M改成更大的值,如5M或其它值
文件上传除了受upload_max_filesize的限制,另外还受post_max_size的影响
我们还要在php.ini文件找到 post_max_size
我们会发现:post_max_size = 8M
它表示通过表单上传的数据最大为8M,其中也包括文件上传
所以,如果想上传大于8M的文件,必须也要更改post_max_size 的值
综上所述,要想上传大文件,必须同时更改php.ini文件中的两个参数:post_max_size 和 upload_max_filesize
改完配置文件,记得一定要重启web服务。
接下来,我们讲解下面这条代码 $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
其中ROOT_PATH是tp5内置的一个常量,它的值是当前tp5的根目录
DS:是php中的一个常量, 表示目录分割符,在windows环境下,目录分割符可以是: \ 或 /,但在linux环境下,目录分割会是: /
那么DS会自动根据当前的操作系统,返回合适的目录分割符
$file->move()方法,就是把上传的文件移动到我们指定的目录下,在移动过程中,也可能出错,所以也要使用if($info)进行判断
执行完上传,我们一定要到上传的目录下,看一下是否有上传来的文件
我们发现,上传到uploads的文件,会自动创建一个目录(根据日期创建的),另外,文件名是一个随机的字符串,而不是原来的文件名
这样做的目的:一是根据日期可以很好的找到文件,二是不会覆盖原来的文件。