問題描述:
在工做中,由於須要將另一個系統的一批產品轉移到本身系統,產品基礎資料什麼的,都沒問題,直接給字段插入數據庫就好,可是遇到了圖片的問題,圖片是在別人的服務器上,首先考慮的是,要不把整個圖片文件打包過來?可是又不須要全部的圖片文件,也就換一種方法,別的系統提供訪問路徑,咱們去抓取。因而採用了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);
先說第一個問題,這個是瀏覽器訪問是會自動將下面所說起的特殊字符進行轉義,因此直接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);