上传图片,将图片保存在腾讯云(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)
版权声明:本文为8013-cmf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。