上传图片,将图片保存在腾讯云(2种方式)
sdk下载地址:https://cloud.tencent.com/document/product/436/6274
文件结构:
1.手动上传图片,传到腾讯云
img.php
1 <!--enctype属性标识提交表单时要用哪种内容类型,我们这是上传文件(二进制数据),使用multipart/form-data--> 2 <form action="upload_img.php" method="post" enctype="multipart/form-data"> 3 <input type="file" name="file" id="file"/> 4 <input type="submit" value="Submit"/> 5 </form>
upload_img.php
1 <?php 2 // 通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。 3 $filename=$_FILES["file"]["name"]; 4 $filesize=$_FILES["file"]["size"]; 5 $filetmp_name=$_FILES["file"]["tmp_name"]; 6 $filetype=$_FILES["file"]["type"]; 7 $rs=astrict($filename,$filesize,$filetmp_name,$filetype); 8 9 if ($rs=='onlyjpg' ||$rs=='big' || $rs=='dengrous'){ 10 exit(json_encode(array('code'=>'0','msg'=>$rs))); 11 } 12 // explode:将字符串打散为数组 13 $ns=explode('.',$rs); 14 if (count($ns)<2){ 15 exit($transCountImg[$rs]); 16 } 17 require('cos/include.php'); 18 use Qcloud\Cos\Api; 19 $config = array( 20 'app_id' => '1256728598', 21 'secret_id' => 'AKIDZy96qOJofIgroXQGG1XnnX1FFzThfNp5', 22 'secret_key' => 'A7tsgGckeJkxvfARTHqAE3cw0pPoyznN', 23 'region' => 'gz', 24 'timeout' => 60 25 ); 26 date_default_timezone_set('PRC'); 27 $cosApi = new Api($config); 28 $y=date('Y'); 29 $m=date('m'); 30 $nad=basename($rs); 31 $dst='/img/'.$y.'/'.$m.'/'.$nad; 32 $buffer='test'; 33 $rets=$cosApi->upload($buffer,$rs,$dst); 34 // var_dump($rets); 35 if ($rets['code'] !='0' || strtoupper($rets["message"]) !='SUCCESS'){ 36 exit($rets["message"]); 37 } 38 // 图片上传到腾讯云后,删除服务器对应文件夹的图片 39 exec("rm -rf $rs"); 40 $url=$rets["data"]["source_url"]; 41 $url=str_replace('http://','https://',$url); 42 exit(json_encode(array('code'=>'1','msg'=>$url))); 43 44 function astrict($picName,$picSize,$picTemp,$picType){ 45 $rd=getimagesize($picTemp); 46 //限制图片的内容只能为jpg和png 47 if ($rd['mime'] != 'image/jpeg' && $rd['mime'] !='image/png'){ 48 return 'onlyjpg'; 49 exit(); 50 } 51 if ($picName != ""){ 52 //限制图片大小 53 if ($picSize > 2097152){ 54 return "big"; 55 exit(); 56 } 57 //判断图片类型 58 if ($picType !='image/jpeg' && $picType !="iamge/png"){ 59 return 'onlyjpg'; 60 exit(); 61 } 62 } 63 $rand=rand(100,999); 64 $pics=md5(date("YmdHis").$rand).".jpg"; 65 $src = './upload/' . $pics; 66 //检测不良字符串 67 if (file_exists($picTemp)) { 68 $resource = fopen($picTemp, 'rb'); 69 $fileSize = filesize($picTemp); 70 fseek($resource, 0); 71 } else { 72 exit($transCountImg["existent"]); 73 } 74 if ($fileSize > 512) { // 取头和尾 75 $hexCode = bin2hex(fread($resource, 512)); 76 fseek($resource, $fileSize - 512); 77 $hexCode .= bin2hex(fread($resource, 512)); 78 } else { // 取全部 79 $hexCode = bin2hex(fread($resource, $fileSize)); 80 } 81 fclose($resource); 82 if (preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode)) { 83 return 'dengrous'; 84 exit(); 85 } 86 move_uploaded_file($picTemp,$src); 87 return $src; 88 }
在学习中遇到的问题:
- (img.php)form的enctype一定要为multipart/form-data
- (upload_img.php)第47行和58行,同时判断图片类型,因为双重判断效果会更好。参考:http://www.lao8.org/article_1479/getimagesize_type
- (upload_img.php)第66行到85行,是为了检测图片内容是否含有不良字符。参考:https://www.cnblogs.com/jingmin/p/6308870.html
- 最重要的一点,坑爹啊,花费了近半小时的时候。第65行,将临时图片存入对应路径的时候,文件夹一定要设置777权限。
2.通过抓取到的url图片地址,传到腾讯云
Test.php
1 <?php 2 require('cos/include.php'); 3 use Qcloud\Cos\Api; 4 $config = array( 5 'app_id' => '1256728598', 6 'secret_id' => 'AKIDZy96qOJofIgroXQGG1XnnX1FFzThfNp5', 7 'secret_key' => 'A7tsgGckeJkxvfARTHqAE3cw0pPoyznN', 8 'region' => 'gz', 9 'timeout' => 60 10 ); 11 date_default_timezone_set('PRC'); 12 $cosApi = new Api($config); 13 $url="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=38344941,2783861310&fm=27&gp=0.jpg"; 14 $content=file_get_contents($url); 15 file_put_contents('./img.jpg',$content); 16 17 $bucket='test'; 18 $rs='./img.jpg'; 19 $y = date('Y'); 20 $m = date('m'); 21 $nad = basename($rs); 22 $dst = '/img/' . $y . '/' . $m . '/' . $nad; 23 24 $rets= $cosApi->upload($bucket, $rs, $dst); 25 // var_dump($rets); 26 $url = $rets['data']['source_url']; 27 $url = str_replace('http://', 'https://', $url); 28 29 exit(json_encode(array('code'=>'1','msg'=>$url)));
在学习中遇到的问题:
- 因为是先学习的上传图片到腾讯云,思路一直死死的停留在通过$_FILES接收到的参数取做,上传等操作,后仔细一想,不对。$_FILES是一个全局数组,怎么会接收一个url地址的图片呢?
- 正确的思路是这样的。先下载图片到服务器,在上传图片到腾讯云
- 下载图片通过(file_get_contents、file_put_contents)