2014-09-19 98 views
24

我有一個捲曲上傳升級從PHP 5.5到5.6之後失敗:捲曲文件上傳不升級後工作了,從PHP 5.5至5.6

$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); 

的文件似乎是在目標系統上的空。

+0

你是如何升級的?捲曲模塊是否包含在更新中?這是什麼操作系統?你是否消除了這個問題的其他原因? – symcbean 2014-09-19 12:39:34

+0

是的,curl正在工作 - 文件是空的(而且字符串被髮送到目標系統而不是文件)。 OS是CentOS,在更新之間沒有改變。 – bardiir 2014-09-19 12:40:39

+0

(在添加您的答案時添加了我的評論) – symcbean 2014-09-19 12:41:56

回答

39

其實我在開始問題時找到了答案。在PHP 5.5中有一個包含curl的新變量:CURLOPT_SAFE_UPLOAD默認情況下,它設置爲false在PHP 5.5中,並且在PHP 5.6中切換爲默認值true

這會阻止'@'上傳修飾符因安全原因而工作 - 用戶輸入可能包含惡意上傳請求。您可以使用CURLFile類上傳文件,而CURLOPT_SAFE_UPLOAD設置爲true或者(如果你確定你的變量是安全的,你可以切換CURLOPT_SAFE_UPLOADfalse手動):

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 但不是在落後的不兼容的改變,真的把我絆倒過......

+4

請注意,將CURLOPT_SAFE_UPLOAD設置爲false會在PHP 5.5或更高版本中發出棄用消息。而不是「@」。 $ localFile'只需使用'new \ CURLFile($ localFile)'。這並不困難。當然,這個類在PHP 5.4中不可用。 – 2015-03-26 22:59:16

+0

看起來只是將'CURLOPT_SAFE_UPLOAD'設置爲false在PHP 5.6中不起作用。讓它工作的正確而唯一的方法是@ deepti-gehlot建議的方法 – 2016-02-10 10:50:01

22

爲PHP 5.5只是做以下更改或更大

而不是"@" . $localFile只使用new \CURLFile($localFile)

並設置

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); 
+0

您拯救了我的一天! – 2017-11-22 02:31:19

8

包括運行時檢查,以使你的代碼具有較低的版本太像下面

兼容
$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); 
+0

$ post_array變量似乎被嚴重命名,不應該是$ aPost? – giorgiosironi 2015-11-17 07:56:07

+0

對不起,忘了重命名變量..謝謝了很多。 :) – 2015-11-17 15:10:13