上傳圖片,將圖片保存在騰訊雲(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     }

在學習中遇到的問題:

  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 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)));

在學習中遇到的問題:

  1. 因為是先學習的上傳圖片到騰訊雲,思路一直死死的停留在通過$_FILES接收到的參數取做,上傳等操作,后仔細一想,不對。$_FILES是一個全局數組,怎么會接收一個url地址的圖片呢?
  2. 正確的思路是這樣的。先下載圖片到服務器,在上傳圖片到騰訊雲
  3. 下載圖片通過(file_get_contents、file_put_contents)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM