PHP curlアップロードファイルバージョン互換性の問題

2112 ワード

微信の開発をして微信のインタフェースを呼び出してファイルをアップロードする時、いつも返します
{"errcode":41005,"errmsg":"media data missing hint: [mQbr_a0173ure1]"}
アップロードファイルは存在しません.
長い間やっていたが,結局PHPバージョンの互換性の問題だった.
アップロードコード
$data = array('media' => '@' . $img);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$info = curl_exec($ch);
curl_close($ch);

このコードはphp 5.6以前のバージョンはすべて正常にアップロードすることができて、しかしPHP 5.6は@文法を捨てて、CURLFile方法のアップロードだけを支持します.このような
言語デザインが後方互換性がないのも酔っ払っています.
5.6このように書く
$data = array('media' => new CURLFile(realpath($tmp_name)));

また、互換性のある方法を独自に設計することもできます.
if(version_compare(phpversion(),'5.5.0') >= 0 && class_exists('CURLFile')){
    $data['file'] = new CURLFile(realpath($tmp_name));
}else{
    $data['file'] = '@'.$tmp_name;
}

さらに、CURLパラメータを構成して、この問題を解決することもできます.
curl_setopt( $ch, CURLOPT_SAFE_UPLOAD, false);
この文は置く
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);前
この設定の公式説明
TRUE to disable support for the @ prefix for uploading files in CURLOPT_POSTFIELDS, 
which means that values starting with @ can be safely passed as fields. CURLFile may be used for uploads instead.
Added in PHP 5.5.0 with FALSE as the default value. PHP 5.6.0 changes the default value to TRUE.
大体の意味がtrueに設定されている場合@文法はCURLOPT_で禁止されていますPOSTFILDSはファイルをアップロードし、CURLFileの代わりにファイルをアップロードします.
5.5バージョンでこのパラメータを追加し、PHP 5.5デフォルトはfalse、PHP 5です.6デフォルト値をtrueに変更
オフィシャルリファレンス
http://cn2.php.net/manual/en/function.curl-setopt.php