PHP 5.0~5.6 各版本兼容的cURL文件上传
最近做的一个需求,使用PHP cURL上传文件。踩坑若干,整理如下。
不同版本PHP之间cURL的区别
PHP的cURL支持通过给CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求。
传统上,PHP的cURL支持通过在数组数据中,使用“@+文件全路径”的语法附加文件,供cURL读取上传。这与命令行直接调用cURL程序的语法是一致的:
1 curl_setopt(ch, CURLOPT_POSTFIELDS, array( 2 'file' => '@'.realpath('image.png'), 3 )); 4 equals 5 $ curl -F "file=@/absolute/path/to/image.png" <url>
但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@语法:
1 curl_setopt(ch, CURLOPT_POSTFIELDS, [ 2 'file' => new CURLFile(realpath('image.png')), 3 ]);
PHP 5.5另外引入了CURL_SAFE_UPLOAD选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。
但是坑的一点在于:
@语法在5.5就已经被打了deprecated,在5.6中就直接被删除了(会产生 ErorException: The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead)。
对于PHP 5.6+而言,手动设置CURL_SAFE_UPLOAD为false是毫无意义的。根本不是字面意义理解的“设置成false,就能开启旧的unsafe的方式”——旧的方式已经作为废弃语法彻底不存在了。
PHP 5.6+ == CURLFile only,不要有任何的

本文介绍如何解决不同PHP版本(cURL)上传文件时的兼容性问题,提供了从PHP5.0到5.6的cURL文件上传代码示例,并讨论了CURLFile类与@语法的区别。
最低0.47元/天 解锁文章
1470

被折叠的 条评论
为什么被折叠?



