У меня есть только вопрос о том, как мне нужно установить заголовок Content-Length с помощью curl в PHP для выполнения HTTP-запросов multipart / form-data POST.
Например, у меня есть PHP-скрипт, который заставляет POST выгружать изображение на сервер, содержимое тела HTTP-запроса будет выглядеть следующим образом:
------Boundary123
Content-Disposition: form-data; name="files[]"; filename="image.png"Content-Type: image/png
... contents of image.png
------Boundary123--
Я делаю что-то вроде этого:
$bodiEntity = "--".$boundary."\r\n".
'Content-Disposition: form-data; name="files[]"; filename="'.$fileName.'"'."\r\n".
'Content-Type: img/png'."\r\n\r\n".
file_get_contents($fileName)."\r\n". // binary contents of file
"--".$boundary."--\r\n";
Но тогда какое значение я должен установить для заголовка Content-Length? Я знаю, это число байтов тела сущности, но как мне обработать «\ r \ n»?
Я имею в виду, если я делаю strlen("\r\n")
Я получаю 2 в качестве возвращаемого значения, но я предполагаю, что это должно быть 1 (имеется в виду) один байт при работе с multipart / form-data, я прав?
Так что я должен просто использовать strlen()
для строк, таких как граничная строка, Content-Disposition, Content-Type и счетчик «\ r \ n» как один символ и использовать filesize()
получить размер файла файла в байтах, а затем суммировать все значения, чтобы получить окончательное значение для заголовка Content-Length? Или я должен считать «\ r \ n» как 2 символа, как это делает PHP?
Спасибо за внимание!
Считайте «\ r \ n» как два байта. Длина пары CRLF составляет два байта. Все тело в том числе
- the boundary prefix ("--"),
- boundary,
- the content bytes,
- the interim boundaries and their prefixes,
- the final boundary prefix,
- boundary and boundary post fix,
все должно быть учтено в содержании длины.
Что касается содержания-длины. Начиная с HTTP 1.1, для каждой части файла не определена длина содержимого.
Тем не менее, заголовок Content-length должен быть определен в начале запроса.
Вы можете прочитать RFC 7230 Раздел 3.3.2. Он был написан одним из основных авторов стандартов веб и HTTP Рой Томас Филдинг.
Но существует множество других способов, которыми файл может быть отправлен как запрос, он не обязательно должен быть ограничен в составном запросе на основе границ. Другой механизм самого метода POST — запрос необработанного типа контента. Содержимое передается сразу после того, как заголовки заканчиваются в запросе, после чего следует пустая строка (читается как «\ r \ n»).
Другие механизмы включают запросы PUT, которые также могут работать аналогичным образом. У обоих из них есть различия, которые технически разделяют их друг от друга, хотя я не думаю, что вдаваясь в эти детали, есть какой-то интерес к этому вопросу, поэтому я просто пропущу его.
Других решений пока нет …