PHP Curl отправка контента длиной в заголовке не работает

Я использую Curl для загрузки фотографий на реальный сайт. Я вижу из Fiddler, что заголовки выглядят так:

Host: test.example.com
Proxy-Connection: keep-alive
Data-Type: json
Accept-Encoding: gzip, deflate
Content-Length: 62601
Content-Type: application/json
Accept-Language: en-us
Accept: application/json
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36

Я использую точные заголовки, как указано выше. Я получаю значение для content-length с помощью filesize

   $file = 'test.jpg';
$file_size = filesize($file);

$headers = array(
"Host: test.example.com",
"Proxy-Connection: keep-alive",
"Data-Type: json",
"Accept-Encoding: gzip, deflate",
"Content-length: $file_size",
"Content-Type: application/json",
"Accept-Language: en-us",
"Connection: keep-alive",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",
);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);

На самом деле мне не нужны заголовки, скрипт обычно работает без него, но он выходит из строя слишком часто, и в попытке устранить неполадки я вставил заголовки.

Все заголовки работают нормально, кроме content-length, Когда я вставляю это, я получаю ответ от сервера, который указывает, что команда не правильно сформирована (я не могу показать фактический ответ здесь). Я не очень разбираюсь в content-length но я считаю, что это сообщает серверу размер файла, и это помогает ему определить, что загрузка завершена. Я думаю, что если бы у меня все это работало правильно, это повысило бы стабильность моего сценария.

Буду признателен за любую помощь.

0

Решение

Если вы хотите отправить файл с curl, поместите полный filePath с предшествующим @, а curl обработает все остальное.

$headers = array(
"Proxy-Connection: keep-alive",
"Data-Type: json",
"Accept-Encoding: gzip, deflate",
"Content-Type: application/json",
"Accept-Language: en-us",
"Connection: keep-alive",
);
$data = array(
'fieldForFile' => '@'.  $filePath //Don't forget @ and the complete file path to the file
'anyOtherFields' => $value,);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
// Use CURLOPT_USERAGENT for setting the user agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $POST_DATA);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);

// Error handling
if($errno = curl_errno($ch)) {
$error_message = curl_strerror($errno);
echo "cURL error ({$errno}):\n {$error_message}";
} else {
echo "Success";
}

curl_close ($ch);
0

Другие решения

Других решений пока нет …