PHP CURL: установка заголовка длины содержимого вручную - PullRequest
7 голосов
/ 16 декабря 2009

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 17 декабря 2009

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

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

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

1 голос
/ 19 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...