入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

PHP Curl post上传图片版本不兼容而引起服务器端接收不到图片问题。

创建时间:2015-08-11 投稿人: 浏览次数:101

最近负责进行公司项目域名的切换工作,迁移项目后发现上传图片后服务器端无法正常接收。代码都是一套,所以能想到的肯定是开发环境不一样导致的。开始以为是扩展问题,于是对比了原来的开发环境,费了些时间搞成一致的后发现还是不行。于是才考虑PHP版本,,果不其然:

PHP5.5以前的版本写法是这样的:

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    "file" => "@/tmp/test.png"), 
));



这里使用“@+文件全路径(/tmp/test.png)”的语法附加文件,供cURL读取上传。

但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@语法:

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    "file" => new CURLFile("/tmp/test.png"), 
)); 

PHP 5.5有可选项CURL_SAFE_UPLOAD,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。

@语法在5.5中会提示过时,但在5.6中直接被删除,使用时会报异常:The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead

可以加个判断:

if (class_exists("CURLFile")) {
    $field = array("file" => new CURLFile("/tmp/test.png"));
} else {
    $field = array("file" => "@/tmp/test.png");
}



所以对于5.6的版本的PHP只能使用CURLFile的方式。这里做个笔记,避免更多的人踩坑。

此文转自:http://segmentfault.com/a/1190000000725185


            
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。