Я могу успешно загрузить изображение в API, используя запрос CURL. Но когда я пытаюсь с Guzzle Client код работает, но загруженное изображение повреждено. Не могли бы вы помочь мне разобраться в проблеме. Я сомневаюсь, что что-то ограничивает размер содержимого файла. Игнорировать любые ошибки программирования c при копировании кода ниже, это работает для меня.
PHP CURL (работает)
class CurlRequest{
private $m_curl=null;
private $m_server="";
public function init(){
$this->m_curl = curl_init();
if($this->m_curl==null)
return(false);
//---
curl_setopt($this->m_curl, CURLOPT_SSL_VERIFYPEER,FALSE); // comment out this line if you use self-signed certificates
curl_setopt($this->m_curl, CURLOPT_MAXCONNECTS,1); // one connection is used
curl_setopt($this->m_curl, CURLOPT_HTTPHEADER,array('Connection: Keep-Alive'));
curl_setopt($this->m_curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($this->m_curl, CURLOPT_SSL_VERIFYPEER, FALSE);
//---
$this->m_server = "https://xxxxx.xxxxxx";
}
public function Post($path, $body)
{
if($this->m_curl==null)
return(false);
curl_setopt($this->m_curl,CURLOPT_POST,true);
curl_setopt($this->m_curl,CURLOPT_URL, $this->m_server.$path);
curl_setopt($this->m_curl,CURLOPT_POSTFIELDS,$body);
curl_setopt($this->m_curl,CURLOPT_RETURNTRANSFER,true);
$result=curl_exec($this->m_curl);
if($result==false)
{
echo 'Curl POST error: '.curl_error($this->m_curl);
return(false);
}
$code=curl_getinfo($this->m_curl,CURLINFO_CONTENT_TYPE);
if($code!=200)
{
echo 'Curl POST code: '.$code;
return(false);
}
return($result);
}
}
$mt5 = new CMT5Request();
$img = file_get_contents('https://media.geeksforgeeks.org/wp-content/uploads/geeksforgeeks-22.png');
//--- Encode the image string data into base64
$data = base64_encode($img);
$response = $mt5->Post('/attachment_add',
json_encode([[
'RelatedClient' => 2161,
'FileType' => "4",
'FileName' => "web_file.jpg",
'FileContent' => $data,
'FileHash' => "ujLgFcA5rLxgfu7pU3jSAw==",
"FileFlags" => "0"
]])
);
Версия Guzzle (загрузка работает, но изображение повреждено)
$request = new Client([
'verify' => false,
'base_uri' => "https://xxxxxxxxxx.xxxxxxx",
]);
$img = file_get_contents('https://media.geeksforgeeks.org/wp-content/uploads/geeksforgeeks-22.png'); //--- Encode the image string data into base64
$data = base64_encode($img);
$body = [[
'RelatedClient' => 2161,
'FileType' => "4",
'FileName' => "web_file.jpg",
'FileContent' => $data,
'FileHash' => "ujLgFcA5rLxgfu7pU3jSAw==",
"FileFlags" => "0"
]]
$response = $request->request("POST", "/add", ['json' => $body]);
В Guzzle я пробовал также "body", "form_params", но все тот же результат. Нужно ли устанавливать / включать какие-либо другие параметры в клиенте Guzzle?
Подробнее о POST Guzzle:
* Found bundle for host xxxxxxx.xxxxx: 0x5654118b8500 [can pipeline]
* Re-using existing connection! (#0) with host xxxxxxxx.xxxxxx
* Connected to xxxxxx.xxxxxx port 443 (#0)
> POST /attachment_add HTTP/1.1
Host: xxxxxx.xxxxxx
User-Agent: GuzzleHttp/6.5.1 curl/7.52.1 PHP/7.2.11
Content-Length: 61772
< HTTP/1.1 200 OK < Content-Length: 70 < Content-Type: application/json < * Curl_http_done: called premature==0 *
Connection #0 to host xxxxxxx.xxxxxx left intact```