PHP CURL: установка заголовка длины содержимого вручную

Скажем, я загружаю файл с 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 ); 

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

 $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). В этой ситуации, как бы получить длину содержимого тела?

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

Solutions Collecting From Web of "PHP CURL: установка заголовка длины содержимого вручную"

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

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

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

Это звучит неправильно. Сгенерированные данные будут включать в себя подзаголовки, а Content-Length также должны включать эти подзаголовки. А поскольку в заголовках есть граница, может включать в себя эту и эти данные, вся эта вещь не может работать (размер не может быть указан, не зная точно, каким будет полный запрос).

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