加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析

发布时间:2021-05-16 17:23:55 所属栏目:编程 来源:网络整理
导读:本文实例说明白PHP5.0~5.6 各版本兼容性cURL文件上传成果。供各人参考研究详细如下: 最近做的一个需求,要通过PHP挪用cURL,以multipart/form-data名目上传文件。踩坑多少,够一篇文章了。 重要告诫 没事不要读PHP的官方中文文档!版本跟不上坑死你

本文实例说明白PHP5.0~5.6 各版本兼容性cURL文件上传成果。分享给各人供各人参考,详细如下:

最近做的一个需求,要通过PHP挪用cURL,以multipart/form-data名目上传文件。踩坑多少,够一篇文章了。

重要告诫

没事不要读PHP的官方中文文档!版本跟不上坑死你!

差异版本PHP之间cURL的区别

PHP的cURL支持通过给CURL_POSTFIELDS转达关联数组(而不是字符串)来天生multipart/form-data的POST哀求。

传统上,PHP的cURL支持通过在数组数据中,行使“@+文件全路径”的语法冈蹲隳件,供cURL读取上传。这与呼吁行直接挪用cURL措施的语法是同等的:

'@'.realpath('image.png'),));

equals

但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以具体界说MIME范例、文件名等也许呈此刻multipart/form-data数据中的附加信息。PHP保举行使CURLFile更换旧的@语法:

new CURLFile(realpath('image.png')),]);

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的方法”——旧的方法已经作为废弃语法彻底不存在了。

我的陈设情形是5.4(

此刻题目来了……

情形判定:警惕邪术数字!

我见过这种情形判定的代码:

= 0)

我对这种代码的评价只有一个字:屎。

这个判定掉入了典范的邪术数字陷阱。版本号莫名其妙的呈此刻代码之中,不查半天PHP手册和更新汗青,很难大白作者被卡在了哪个成果的改观上。

代码应该回归本源。我们的现实需求着实是:有CURLFile就优先回收,没有再退化到传统@语法。那么代码就来了:

new CURLFile(realpath($filepath))); } else { $field = array('fieldname' => '@' . realpath($filepath)); }

提议明晰指定的退化选项

从靠得住的角度,保举指定CURL_SAFE_UPLOAD的值,明晰奉告php是容忍照旧榨取旧的@语法。留意在低版本PHP中CURLOPT_SAFE_UPLOAD常量自己也许不存在,必要判定:

cURL选项配置的次序

不管是curl_setopt()单发照旧curl_setopt_array()批量,cURL的选项老是配置一个见效一个,而配置好的选项立即就会影响cURL在配置后续选项时的举动。

譬喻CURLOPT_SAFE_UPLOAD就和CURLOPT_POSTFIELDS的举动有关。假如先配置CURLOPT_POSTFIELDS再配置CURLOPT_SAFE_UPLOAD,那么后者的束缚浸染就不会见效。由于配置前者时cURL就已经把数据现实的识读处理赏罚完毕了!

cURL有那么几个选项存在这种坑,务必警惕。还好这种存在“依靠相关”的选项不多,机制也不伟大,简朴处理赏罚即可。我的要领是先批量配置全部的选项,然后直到curl_exec()的前一刻才用curl_setopt()单发配置CURLOPT_POSTFIELDS

现实上在curl_setopt_array()用的数组中,担保CURLOPT_POSTFIELDS的位置在后边也是靠得住的。PHP的关联数组是有次序保障的,我们也可以假设curl_setopt_array()内部的执行次序必然是从新到尾按次序(好吧我知道assume不是件功德,不外有些其实过度浅近的究竟,就容我下个最低限度的断言吧),以是尽可安心。

我的做法只是在代码示意上加个多余的保险,突出夸大次序的重要性防往后手贱。

定名空间

PHP 5.2或以下的版本没有定名空间。代码顶用到了空间脱离符就会激发理会器错误。要照顾PHP 5.2着实轻易想,放弃定名空间即可。

要留意的反倒是有定名空间的PHP 5.3+。无论是挪用CURLFile照旧用class_exists()判定CURLFile的存在性,都保举写成CURLFile明晰指定顶层空间,防备代码包裹在定名空间内的时辰崩掉。

更多关于PHP相干内容感乐趣的读者可查察本站专题:《》、《》、《》、《》、《》、《》及《》

但愿本文所述对各人PHP措施计划有所辅佐。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读