項目換成php7.0,進行了測試,使用curl時,出現:
curl_setopt(): Disabling safe uploads is no longer supported in xxx。定位到代碼行:
[php]
view plain
copy
//5.6版本相容 if (ver_compare(phpversion(), '5.6') >= 0) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); }
所有問題都是因為 CURLOPT_SAFE_UPLOAD 這個選項。
1.檢視手冊發現,5.50添加該選項,預設值為false。5.6之後,預設值為true,這裡另其為false。
2.手冊上并未更新文檔,7.0以後,不支援禁用該選項,是以導緻了我們更新到7.0後,一直報錯!
直接不用使用該選項了,網上有個解決方案是,并沒有多大意義:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上面的解決方法不合理,又找了點資料
php5.6關于curl以@方式上傳檔案的變化及解決七牛上傳時報file
is not specified in multipart的問題
上面的文章就提到了這個問題,但是針對的是php5.6
7.0後,curl不支援設定 CURLOPT_SAFE_UPLOAD設定為false,隻能是true。但是提供了使用 CURLFile來替代的方案,可檢視手冊,手冊中有人寫到:
[php]
view plain
copy
if(is_array($postfields) == true) { // Check each post field foreach($postfields as $key => $value) { // Convert values for keys starting with '@' prefix if(strpos($value, '@') === 0) { // Get the file name $filename = ltrim($value, '@'); // Convert the value to the new class $postfields[$key] = new CURLFile($filename); } } } curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
發現傳輸的post中有以 '@' 開頭的檔案,使用new CURLFile() 來轉換,然後就可以不用設定 curlopt_safe_upload為false了。這個是5.5以後才支援的。
為了相容性,可以7.0以前,設定為curlopt_safe_upload=false,7.0後,發現@,進行curlfile來轉換,就可以解決這個問題了,我們項目中的截圖如下: