th框架
前提:环境配置成功,并且成功运行thinkphp框架
今天第一次写博客,刚刚更新的微博是系统默认~~
说一下昨天晚上遇到的php上传图片和视频问题,在这里稍作总结。这里仅仅以Admin后台为例
上传文件须在form表单中(action位置)添加 enctype=”multipart/form-data”
(1)上传图片只是一个input
**第一步**Application\Common\Common\function.php可以写这样一个函数来封装,完成上传图片的操作,并且返回$ret数组。三个形参的意义:①上传的input的name属性②上传的Public目录名③生成的缩略图大小的数组。
$ret是生成的图片路径数组,其中也包括提示信息ok和error
function uploadOne($imgName,$dirName,$thumb = array()){
//上传logo
if (isset($_FILES[$imgName]) && $_FILES[$imgName]['error'] == 0) {
//有图片 tp框架提供了代码
$rootPath = C('IMG_rootPath');
$upload = new \Think\Upload(array(
'rootPath' => $rootPath,
));// 实例化上传类
$upload->maxSize = (int)C('IMG_maxSize') * 1024 * 1024;// 设置附件上传大小
$upload->exts = C('IMG_exts');// 设置附件上传类型
// $upload->rootPath = $rootPath; // 设置附件上传根目录 当前目录入口文件目录
$upload->savePath = $dirName . '/'; // 设置附件上传(子)目录 图片二级目录
// 上传文件
$info = $upload->upload();
if (!$info) {// 上传错误提示错误信息
return array(
'ok'=>0,
'error'=>$upload->getError()
);
} else {// 上传成功
$ret['ok'] = 1;
$ret['images'][0] = $logoName = $info[$imgName]['savepath'] . $info[$imgName]['savename'];
//判断是否生成缩略图
if($thumb){
$image = new \Think\Image();
//拼出每个缩略图的文件名
foreach ($thumb as $k => $v) {
$ret['images'][$k+1] = $smLogoName = $info[$imgName]['savepath'] . 'thunmb'.$k.'_' . $info[$imgName]['savename'];
$image->open($rootPath . $logoName);//打开文件
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.jpg
$image->thumb($v[0], $v[1])->save($rootPath . $ret['images'][$k+1]);
}
}
return $ret;
}
}
}
第二步在对应的Application\Admin\Model下的*.class.php文件中的插入之前的函数中将data[‘数据库列名’]赋值,在Controller中调用add函数会插入到数据库。
protected function _before_insert(&$data, $option)
{
$ret = uploadOne('avator', 'Chang', array(//avator是form表单中的input的name属性
array(100, 100),//这里的array是灵活的,这样表示生成两张缩略图
array(100, 100),
));
// var_dump($ret);die;
if ($ret['ok'] == 1) {
//把图片的路径放到数据库中
$data['avator'] = $ret['images'][0];//原图地址
}
}
注:数据库中字段名和第二步中的data[‘avator’]需一致
(2)同时上传图片和视频
(意味着包含两个或者多个input)无需封装
嘎嘎 在Model的*.class.php文件的_before_insert(翻译:插入之前)函数配置好上传信息,包括上传根路径,大小,保存路径。然后调用tp的upload函数,打印$info信息,如若第一次就打印出所有input(数组形式)的信息则直接成功可以进行第二步(代码)。
图片因为不大,所以一般都能打印,视频信息不能打印看番外~~
protected function _before_insert(&$data, $option)
{
$rootPath = C('IMG_rootPath');
$upload = new \Think\Upload(array(
'rootPath' => $rootPath,
));// 实例化上传类
$upload->maxSize = (int)C('IMG_maxSize') * 1024 * 1024;// 设置附件上传大小
$upload->exts = C('IMG_exts');// 设置附件上传类型
// $upload->rootPath = $rootPath; // 设置附件上传根目录 当前目录入口文件目录
$upload->savePath = "Game" . '/'; // 设置附件上传(子)目录 图片二级目录
$info = $upload->upload();
// var_dump($info);exit;
//第二步代码
$logoName1 = $info['logo']['savepath'] . $info['logo']['savename'];
$smLogoName1 = $info['logo']['savepath'] . 'thunmb'.'_' . $info['logo']['savename'];
$logoName2 = $info['img']['savepath'] . $info['img']['savename'];
$video = $info['video']['savepath'] . $info['video']['savename'];
$image = new \Think\Image();
$image->open($rootPath . $logoName1);//打开文件
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.jpg
$image->thumb(100, 100)->save($rootPath . $smLogoName1);
$data['logo'] = $logoName1;
$data['sm_logo'] = $smLogoName1;
$data['img'] = $logoName2;
$data['video'] = $video;
}
番外:<1> 代码中设置附件类型须包含视频类型mp4 rmvb等
<2>Application\Common\Conf\config.php文件的IMG_maxSize设置大小受限制
<3> 打开wampserver->PHP->php.ini文件,几个上传文件设置值的修改(网速可能有关)
file_uploads = on
upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M
post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值