解决这个问题需要注意两点:
首先来看form表单的基本写法:
在这里,我需要上传一个背景图片,上传一个视频文件。
一:查看ThinkPHP官方手册,标的很明确,在
标签里一定要写上 enctype=”multipart/form-data” 。如果不写,文件是无法上传的。(直接遵守就行)
官方参考页面:http://www.thinkphp.cn/info/194.html
二:如果你第一步设置后,文件还是无法上传,这时,你要注意的是form标签里写的method 。有时写成post就造成var_dump($_FILES)时输入的数组为空值。这时改成大写的POST。
三:php默认的post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size , $_POST 和 $_FILES 超全局变量便会为空.
解决办法:
- 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完. 但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行. 这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time 在php.ini里查找 max_execution_time (翻译为最大执行时间)默认是30秒.改为 max_execution_time = 0(可修改范围为PHP_INI_ALL) 0表示没有限制 或者在php文件头设置ini_set(‘max_execution_time’,0);
-
修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。 查找 post_max_size .改为 post_max_size = 150M(可修改范围为PHP_INI_PHP_INI_PERDIR)
-
很多人都会改了第二步.但上传文件时最大仍然为 8M. 为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大值。 查找upload_max_filesize,默认为8M改为 upload_max_filesize = 100M(可修改范围为PHP_INI_PHP_INI_PERDIR)
另外要说明的是post_max_size是整个表单的大小,而upload_max_filesize是上传文件的大小,前者应大于后者.
表单提交到了home模块下的user控制器下的do_upload方法。,下面把方法贴上:
public function do_upload()
{
//var_dump($_FILES);
if ($_FILES['defaultpic']['error'] == 4) { //判断文件是否上传
$this->error('请上传图片');
}
if ($_FILES['videourl']['error'] == 4) { //判断文件是否上传
$this->error('请上传视频');
}
$savepath = date('Ymd') . '/'; //取得当前时间作为上传文件时生成文件夹命名用
//上传处理类
$config = array(
'rootPath' => './' . C("UPLOADPATH"),
'savePath' => $savepath,
'maxSize' => 0, //大小不做限制
'saveName' => array('uniqid', ''),
'exts' => array('jpg', 'png', 'jpeg', "mp4", 'avi', 'flv'), //上传文件的格式
'autoSub' => false,
);
$upload = new \Think\Upload($config);//
$info = $upload->upload(); //执行上传方法
//开始上传
if ($info) { //如果文件上传成功
//写入附件数据库信息
$first = array_shift($info);
if (!empty($first['url'])) {
$pic = $first['url'];
} else {
$pic = C("TMPL_PARSE_STRING.__UPLOAD__") . $savepath . $first['savename']; //返回上传成功之后的默认图片文件名
}
$first2 = array_shift($info);
if (!empty($first2['url'])) {
$video = $first2['url'];
} else {
$video = C("TMPL_PARSE_STRING.__UPLOAD__") . $savepath . $first2['savename']; //返回上传成功之后的默认图片文件名
}
} else {
//上传失败,返回错误
$this->error($upload->getError());
}
//1
$data = array( //将上传数据存放到数组里
"title" => $_POST['title'],
"defaultpic" => $pic,
"videourl" => $video,
"memo" => $_POST['memo'],
"content" => $_POST['content']
);
$videos = M("videos")->add($data); //执行添加数据库操作,并返回参数
/*
* //第二种方法保存到数据库
*
*$videos = M("videos");
$videos->create();
$videos->src = $pic;
if ($videos->add()) {
$this->success('成功');
}else{
$this->error($upload->getError());
}
*/
if ($videos == false) {
$this->error("上传失败");
} else {
$this->success('上传成功');
}
}