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);
相关文章
相关标签/搜索