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 но я считаю, что это сообщает серверу размер файла и помогает определить, что загрузка завершена. Я думаю, что если бы у меня все это работало правильно, это повысило бы стабильность моего сценария.

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

1 ответ

Если вы хотите отправить файл с 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);
Другие вопросы по тегам