微信上传永久素材并保存图片URL到数据库
基于tp5编写的
一下只为核心代码,不是完整的。
Wechat.php需要继承Base.php才可以使用它里面的方法。
Wechat.php下的添加图片方法如下:
1 public function add()//上传图片素材 2 { 3 //echo $_SERVER['DOCUMENT_ROOT']; 4 //$this->upload(); 5 if(request()->isPost()){ 6 $date=date("Y-m-d h:i:s"); 7 $data['date']=$date; 8 //图片上传 9 if($_FILES['pic']['tmp_name']){ 10 $file = request()->file('pic'); 11 // 移动到框架应用目录/public/static/ 目录下 12 $info = $file->move(ROOT_PATH . 'public/static' . DS . 'uploads'); 13 // var_dump( $info); 14 if($info){ 15 // 成功上传后 获取上传信息 16 $data['pic']='uploads/'.date('Ymd').'/'.$info->getFilename(); 17 $url=$this->upload($data['pic']); 18 $data['url']=$url; 19 //echo $info->getFilename(); die; 20 // echo $data['pic']; die; 21 }else{ 22 // 上传失败获取错误信息 23 return $this->error($file->getError()); 24 } 25 26 //图片上传 27 if(\think\Db::name('sucai')->insert($data)){ 28 return $this->success('添加成功!','sucai'); 29 }else{ 30 return $this->error('添加失败!'); 31 } 32 }else{return $this->error('请先选择图片');} 33 } 34 35 }
Base.php里的核心方法如下:
1 public function upload($pic)//调用上传素材的方法(可用) 2 { //$pic为上传成功后的图片相对路径,还需拼接 3 $access_token=$this->getWxAccessToken(); 4 $type="image"; 5 //$filepath=dirname(__FILE__)."\pic\wo.jpg";//法一:从当前文件夹开始拼接路径,(可用的) 6 //$filepath= $_SERVER['DOCUMENT_ROOT']."/wexin/public/static/uploads/test.jpg";//法二:从网站根目录拼接路径,(可用的) 7 $filepath= $_SERVER['DOCUMENT_ROOT']."/wexin/public/static/".$pic; 8 $filepath=str_replace("/","\\",$filepath);//windows上传需要用\,所以替换一下 9 $filedata=array("media"=>"@".$filepath); 10 //$url="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=$access_token&type=$type";//临时素材接口,(可用) 11 $url="https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=$access_token";//永久素材接口(可用) 12 $result=$this->httpsPic($url,$filedata); 13 $result=json_decode($result,true); 14 $result=str_replace("\\","", $result['url']);//需要用/,替换回来 15 return $result; 16 } 17 18 public function httpsPic($url,$data)//上传图片素材方法(可用) 19 { 20 $curl=curl_init(); 21 curl_setopt($curl,CURLOPT_URL, $url); 22 curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE); 23 curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE); 24 if(!empty($data)){ 25 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); 26 curl_setopt($curl,CURLOPT_POSTFIELDS,$data); 27 } 28 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); 29 $output=curl_exec($curl); 30 if(curl_error($curl)){ 31 curl_error($curl); 32 curl_close($curl); 33 }else{ 34 return $output; 35 } 36 }