上传图片,将图片保存在腾讯云(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 QcloudCosApi;
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     }

在学习中遇到的问题:

  1. (img.php)form的enctype一定要为multipart/form-data
  2. (upload_img.php)第47行和58行,同时判断图片类型,因为双重判断效果会更好。参考:http://www.lao8.org/article_1479/getimagesize_type
  3. (upload_img.php)第66行到85行,是为了检测图片内容是否含有不良字符。参考:https://www.cnblogs.com/jingmin/p/6308870.html
  4. 最重要的一点,坑爹啊,花费了近半小时的时候。第65行,将临时图片存入对应路径的时候,文件夹一定要设置777权限。

2.通过抓取到的url图片地址,传到腾讯云

Test.php

 1 <?php
 2     require('cos/include.php');
 3     use QcloudCosApi;
 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)));

在学习中遇到的问题:

  1. 因为是先学习的上传图片到腾讯云,思路一直死死的停留在通过$_FILES接收到的参数取做,上传等操作,后仔细一想,不对。$_FILES是一个全局数组,怎么会接收一个url地址的图片呢?
  2. 正确的思路是这样的。先下载图片到服务器,在上传图片到腾讯云
  3. 下载图片通过(file_get_contents、file_put_contents)
原文地址:https://www.cnblogs.com/8013-cmf/p/9046531.html