Описание:
Что такое кодировка multipart/form-data?
Как вы знаете, в обычном POST-запросе все параметры передаются в одной строке ( param1=value1¶m2=value2& ... итд.). Наряду с этим существует еще один способ, повсеместно используемый для отправки файла через веб-форму. Данные здесь уже не кодируются в urlencode а отправляются как есть, разграниченные специальными разделителями, которые вы сами генерируете и указываете в заголовке (официальная спецификация RFC1867). Вот пример, как выглядел бы ваш запрос отсылки капчи:
POST http://antigate.com/in.php HTTP/1.0
Content-Type: multipart/form-data; boundary=*BBBBBB*
Host: antigate.com
Content-Length: *XXXXXX*
--*BBBBBB*
Content-Disposition: form-data; name="method"
post
--*BBBBBB*
Content-Disposition: form-data; name="key"
2426c17036718523d2213d23b06389
--*BBBBBB*
Content-Disposition: form-data; name="file"; filename="capcha.jpg"
Content-Type: image/pjpeg
*CCCCCC*
--*BBBBBB*--
Где:
*BBBBBB* - разделитель, который должен быть достаточно уникальным (чтобы не повториться случайно в других данных).
Пример: -------------b358fdj4ha19fdk
Обратите внимание на то, как в примере разделитель используется с 2мя дефисами спереди каждый раз перед указыванием нового параметра и с 2мя дефисами спереди и в конце запроса.
*CCCCCC* - содержимое ФАЙЛА капчи, БЕЗ какого либо кодирования, целиком.
*XXXXXX* - длина содержимого POST-запроса в байтах, начиная от первого разделителя --*BBBBBB* до последнего --*BBBBBB*-- ВКЛЮЧАЯ ОБА. Т.е. предварительно нужно собрать содержимое запроса в памяти, посчитать его длину и уже потом формировать окончательный запрос.
PS. Соответственно если вы шлете не JPG а, скажем, GIF, то Content-Type должен быть не image/pjpeg, а image/gif. То же самое для формата PNG - image/png