1. 程式人生 > >PHP5.6通過CURL上傳圖片@符無效的兼容問題

PHP5.6通過CURL上傳圖片@符無效的兼容問題

本地 之前 做了 num tran 新的 需要 keyword 找到

今天本來想試試一個圖片雲的API,於是本地做了個上傳圖片的測試,結果灰常郁悶的發現以前一直用的好好的CURL上傳圖片居然死活不起作用,本來幾分鐘搞定的事情,結果折騰了大半天才終於找到原因,居然是兼容性問題,真是無語。。

網上搜索PHP通過CURL上傳圖片幾乎都是類似下面的代碼:
技術分享圖片

以前上傳圖片都是在圖片路徑前面增加一個 @符號,如:

$file = __DIR__ .‘/0634134726bc5b8b.jpg‘;
$data = array(‘mypic‘=>‘@‘. $file);
  • 1
  • 2

這樣就行了,但現在這種情況一般只適用於 PHP5.6以下的版本。
對5.6來說,直接加@是木有用的啦。

解決辦法有兩個:一種是兼容;二是使用新的方法。

1 . 兼容方法:
主要用到 CURL 的一個配置參數 CURLOPT_SAFE_UPLOAD
CURLOPT_SAFE_UPLOAD 在 PHP5.5中默認值是 false
而在 PHP5.6中已經默認為 true 了。
所以只需要增加一行強制設置為 false 就行,如下:
註意:該參數的設置順序,必須在設置 CURLOPT_POSTFIELDS 參數之前才有效哦!!!

<?php
$url = ‘http://127.0.0.1/test3.php‘;
$file = __DIR__ .‘/0634134726bc5b8b.jpg‘;
$data = array(‘mypic‘=>‘@‘. $file);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$content = curl_exec($curl);
curl_close($curl);
print_r($content);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2 . 新的圖片上傳方法:
使用 CURLFile 類來處理文件,如下:

$url = ‘http://127.0.0.1/test3.php‘;
$file = __DIR__ .‘/0634134726bc5b8b.jpg‘;
$data = array(‘mypic‘=>new CURLFile($file));
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$content = curl_exec($curl);
curl_close($curl);
print_r($content);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

我這裏只是最簡單的應用,具體可參考下面官方文檔:
http://php.net/manual/en/class.curlfile.php

這下終於上傳成功了。。。太坑爹了,一天時間又被折騰完了。

PHP5.6通過CURL上傳圖片@符無效的兼容問題