上传图⽚,将图⽚保存在腾讯云(2种⽅式)sdk下载地址:t/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
9if ($rs=='onlyjpg' ||$rs=='big' || $rs=='dengrous'){
10exit(json_encode(array('code'=>'0','msg'=>$rs)));
11    }
12//    explode:将字符串打散为数组
13$ns=explode('.',$rs);
14if (count($ns)<2){
15exit($transCountImg[$rs]);
16    }
17require('cos/include.php');
18use 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);
35if ($rets['code'] !='0' || strtoupper($rets["message"]) !='SUCCESS'){
36exit($rets["message"]);inputtypefile不上传文件
37    }
38//    图⽚上传到腾讯云后,删除服务器对应⽂件夹的图⽚
39exec("rm -rf $rs");
40$url=$rets["data"]["source_url"];
41$url=str_replace('','',$url);
42exit(json_encode(array('code'=>'1','msg'=>$url)));
43
44function astrict($picName,$picSize,$picTemp,$picType){
45$rd=getimagesize($picTemp);
46//限制图⽚的内容只能为jpg和png
47if ($rd['mime'] != 'image/jpeg' && $rd['mime'] !='image/png'){
48return 'onlyjpg';
49exit();
50        }
51if ($picName != ""){
52//限制图⽚⼤⼩
53if ($picSize > 2097152){
54return "big";
55exit();
56            }
57//判断图⽚类型
58if ($picType !='image/jpeg' && $picType !="iamge/png"){
59return 'onlyjpg';
60exit();
61            }
62        }
63$rand=rand(100,999);
64$pics=md5(date("YmdHis").$rand).".jpg";
65$src = './upload/' . $pics;
66//检测不良字符串
67if (file_exists($picTemp)) {
68$resource = fopen($picTemp, 'rb');
69$fileSize = filesize($picTemp);
70fseek($resource, 0);
71        } else {
72exit($transCountImg["existent"]);
73        }
74if ($fileSize > 512) { // 取头和尾
75$hexCode = bin2hex(fread($resource, 512));
76fseek($resource, $fileSize - 512);
77$hexCode .= bin2hex(fread($resource, 512));
78        } else { // 取全部
79$hexCode = bin2hex(fread($resource, $fileSize));
80        }
81fclose($resource);
82if (preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode)) { 83return 'dengrous';
84exit();
85        }
86move_uploaded_file($picTemp,$src);
87return$src;
88    }
在学习中遇到的问题:
1. (img.php)form的enctype⼀定要为multipart/form-data
2. (upload_img.php)第47⾏和58⾏,同时判断图⽚类型,因为双重判断效果会更好。参考:/article_1479/getimagesize_type
3. (upload_img.php)第66⾏到85⾏,是为了检测图⽚内容是否含有不良字符。参考:wwwblogs/jingmin/p/6308870.html
4. 最重要的⼀点,坑爹啊,花费了近半⼩时的时候。第65⾏,将临时图⽚存⼊对应路径的时候,⽂件夹⼀定要设置777权限。
2.通过抓取到的url图⽚地址,传到腾讯云
Test.php
1 <?php
2require('cos/include.php');
3use 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="ss3.bdstatic/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=38344941,2783861310&fm=27&gp=0.jpg";
14$content=file_get_contents($url);
15file_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('', '', $url);
28
29exit(json_encode(array('code'=>'1','msg'=>$url)));
在学习中遇到的问题:
1. 因为是先学习的上传图⽚到腾讯云,思路⼀直死死的停留在通过$_FILES接收到的参数取做,上传等操作,后仔细⼀想,不对。$_FILES是⼀个全局数组,怎么会接收⼀个url地址
的图⽚呢?
2. 正确的思路是这样的。先下载图⽚到服务器,在上传图⽚到腾讯云
3. 下载图⽚通过(file_get_contents、file_put_contents)