2009-12-16 5 views
7

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

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

ответ

7

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

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

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

1

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

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

Смежные вопросы