Скажем, я загружаю файл с 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). В этой ситуации, как бы получить длину содержимого тела?
Спасибо за любой свет на этом, это, кажется, сложная проблема.
Чтобы получить длину тела сообщения, попробуйте форматировать поля int в строке стиля GET (aka param1=value1¶m2=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