PHP CURL: ручная настройка заголовка content-length

скажем, я загружаю файл с PHP, CURL:

$postData = array();

$postData['file_name'] = "test.txt";
$postData['submit'] = "UPLOAD";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData );

теперь предположим, что мне нужно вручную установить заголовок content-length.

$headers=array(
     "POST /rest/objects HTTP/1.1",
     'accept: */*',
     "content-length: 0" //instead of 0, how could I get the length of the body from curl?
    )
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers
$response = curl_exec($ch);

Как бы я измерил размер тела? (просто указание размера файла как длины содержимого, похоже, не работает)

в другом примере что делать, если тело содержит данные, которые не являются фактическим файлом. (вручную устанавливается postfields) в этой ситуации, как бы я получил длину содержимого тела?

Спасибо за любую пролить свет на это, кажется, непростой вопрос.

2 ответов


чтобы получить длину тела сообщения, попробуйте форматировать поля в строке стиля GET (aka param1=value1&param2=value2) затем установите эту строку как CURL_POSTFIELDS С curl_setopt. Массив не должен быть предоставлен. Вы можете просто использовать strlen() чтобы получить значение для заголовка content-length.

если вы публикуете файл (или файлы) в дополнение к другим полям, как показано в приведенном выше примере, вы должны указать значение для файла как @/path/to/file, то получить размер в bytes и добавьте это к общей длине содержимого.

Итак, для приведенного выше примера, предполагая файл test.txt находится в /test dir вашего сервера строка значения post будет file_name=@/test/text.txt&submit=UPLOAD. Вы должны url_encode эта строка также, прежде чем назначить ее в качестве значения curl post. Чтобы получить длина контент вы получаете длину этой строки (post url-кодирование) и добавить его в размер of /test/test.txt.


Это звучит неправильно. Генерируемые данные будут включать подзаголовки, а длина контента также должна включать эти подзаголовки. И поскольку подзаголовки включают границу, могут включать в себя те или иные данные, все это не может работать (размер не может быть указан, не зная точно, каким будет полный запрос.)

на самом деле, единственный, кто может вычислить размер, из того, что я вижу, это сам завиток. Но он этого не делает 8-P