PHP 5.5から5.6へのアップグレード後に失敗するcURLアップロードがあります:
$aPost = array(
'file' => "@".$localFile,
'default_file' => 'html_version.html',
'expiration' => (2*31*24*60*60)
)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiurl);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$sResponse = curl_exec ($ch);
ファイルは、ターゲットシステムで空のようです。
実際、質問を始めている間に答えを見つけました。 PHP 5.5:CURLOPT_SAFE_UPLOAD
これは、PHP 5.5でデフォルトでfalse
に設定され、PHPでデフォルトのtrue
に切り替えられます。 5.6。
これにより、「@」アップロード修飾子がセキュリティ上の理由で機能しなくなります-ユーザー入力に悪意のあるアップロード要求が含まれる可能性があります。 CURLFile
クラスを使用してファイルをアップロードできますが、CURLOPT_SAFE_UPLOAD
はtrue
に設定されます(または変数が安全であることが確実な場合は、CURLOPT_SAFE_UPLOAD
からfalse
に手動で):
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
正しい方向に私を検索させた情報のソースは次のとおりです。 http://comments.gmane.org/gmane.comp.php.devel/87521
変更された関数にも記載されています: http://php.net/manual/en/migration56.changed-functions.php しかし、後方互換性のない変更ではなく、本当に私をつまずかせました...
PHP 5.5以降で以下の変更を行うだけです
_"@" . $localFile
_の代わりにnew \CURLFile($localFile)
を使用してください
そしてセット
_curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
_
ランタイムチェックを含めて、コードが以下のような下位バージョンとも互換性を持つようにします
$aPost = array(
'default_file' => 'html_version.html',
'expiration' => (2*31*24*60*60)
)
if ((version_compare(PHP_VERSION, '5.5') >= 0)) {
$aPost['file'] = new CURLFile($localFile);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
$aPost['file'] = "@".$localFile;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiurl);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$sResponse = curl_exec ($ch);