URL特殊字符轉義

問題描述:
在工做中,由於須要將另一個系統的一批產品轉移到本身系統,產品基礎資料什麼的,都沒問題,直接給字段插入數據庫就好,可是遇到了圖片的問題,圖片是在別人的服務器上,首先考慮的是,要不把整個圖片文件打包過來?可是又不須要全部的圖片文件,也就換一種方法,別的系統提供訪問路徑,咱們去抓取。因而採用了PHP的curl方式抓取圖片。可是遇到2個問題:
1 給的圖片連接,放入瀏覽器能訪問,可是curl訪問時返回400錯誤
好比圖片連接:xw.vekinerp.com/flyingbird-ecpp/data/upload/160929/CF60EI-6-Eiffel Tower.jpg
2 給的圖片連接,包含中文,瀏覽器能訪問,curl訪問返回400
好比圖片連接:fb.vekinerp.com/flyingbird-ecpp/ftp/GX65 米釘太陽鏡-小林/GX65-C-C30-11-BlackBlue BlueMirror.jpg數據庫

代碼以下:瀏覽器

$hander = curl_init();
curl_setopt($hander,CURLOPT_URL,$image);
curl_setopt($hander,CURLOPT_FILE,$fp);
curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($hander,CURLOPT_TIMEOUT,60);
$result = curl_exec($hander);
if( $result == true )
{
     $statusCode = curl_getinfo($hander,CURLINFO_HTTP_CODE);
     if( $statusCode == 200 )
     {
          $image_path = $filename;
     }
 }
curl_close($hander);
  1. 先說第一個問題,這個是瀏覽器訪問是會自動將下面所說起的特殊字符進行轉義,因此直接CURL訪問時會報400錯誤,轉義以後就能正常訪問了,可是後來發現個問題,/ 和 % 這兩個字符,需注意 / 若是是url訪問路徑的分割符,本來是不用轉義的,轉義以後反而弄巧成拙, % 字符,以下所見,下面的大部分字符轉義以後都帶有%這個特殊字符,好比把+轉成%2B後,又對%2B中的%進行轉義,這樣就又錯了……因此需注意轉義的前後順序服務器

第一個問題,對$image進行轉義app

$image = str_replace(' ', '%20', $image);

特殊字符說明轉載於
http://blog.csdn.net/wswqiang...curl

URL中一些字符的特殊含義,基本編碼規則以下: 編碼

一、空格換成加號(+)
二、正斜槓(/)分隔目錄和子目錄
三、問號(?)分隔URL和查詢
四、百分號(%)制定特殊字符
五、#號指定書籤
六、&號分隔參數 url

若是須要在URL中用到,須要將這些特殊字符換成相應的十六進制的值.net

字符                                   URL編碼值 
空格                                     %20 
"                                         %22 
#                                        %23 
%                                        %25 
&                                         %26 
(                                         %28 
)                                         %29 
+                                          %2B 
,                                          %2C 
/                                          %2F 
:                                          %3A 
;                                          %3B 
<                                          %3C 
=                                          %3D 
>                                          %3E 
?                                         %3F 
@                                         %4o 
\                                           %5C 
|                                           %7C

2 第二個問題:所說的中文路徑問題,在網上搜了個方法,說是要加頭信息,可是貌似無論用,先貼在這裏,後續再研究code

$headers = array('content-type: application/x-www-form-urlencoded;charset=UTF-8');
curl_setopt($hander, CURLOPT_HTTPHEADER, $headers);
相關文章
相關標籤/搜索