![]() |
|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]()
|
|
| slva2000 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Так и не нашёл подтверждения своих мыслей. Задача проста: отправить форму методом пост, посредствам библиотеки CURL. Сложность заключается в отправке вместе с формой ФАЙЛА.
Использую следующий код:
Сайт удалённый (посмотреть что получает $_POST[file] не могу) В результате форма принимает name (USER) а файл не подгружается. Выполняю из под Apatch (win32), файл лежит в корне скрипта (пробовал и с:\\my_file.jpg и с://my_file.jpg). Замучался, поясните где ошибка.. |
|||
|
||||
| slva2000 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Уф, ну и не разбериха с этим курлом... Нашёл две детали (только с отладочными скриптами):
1. CURLOPT_POST должна идти обязательно перед CURLOPT_POSTFIELDS (иначе не принимает файл) 2. Заголовки я формировал для своей функции классические:
С ними отправить файл не удавалось. Что ж, решил скопировать заголовки со снифера (реальный пост на сайте):
Тоже не принимал такие. Удалил CURLOPT_HTTPHEADER с функции, всё заработало. Файл был принят сервером. В голове не осталось ничего полезного Добавлено через 8 минут и 5 секунд Забыл добавить: CURLOPT_POSTFIELDS должен быть массивом: array("name_input" => "value"); |
||||
|
|||||
| Pitlord |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 31.10.2009 Репутация: 1 Всего: 7 |
Стоит читать мануал (http://php.net/manual/en/function.curl-setopt.php):
(обрати внимание на символ "@") А кто просит тебя формировать Content-type? При передачи файла Content-type другой: multipart/form-data (+ boundary). Добавлено через 2 минуты и 46 секунд Тут статья на тему как оформляются заголовки при передаче файла: http://phpclub.ru/detail/article/http_request#part_3_2 Это сообщение отредактировал(а) Pitlord - 26.11.2009, 17:52 |
|||
|
||||
| slva2000 |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Pitlord
обясни мне пожалуйста следующие вещи: Три примера, работает только первый. Второй имеет строку (вместо массива) для передачи POST значений, а третий, порядок POSTFIELDS. upload.php:
(не забудь положить 0.gif в ./home/localhost/) Варинат 1. (единственный рабочий из предложеных) index.php:
Варинат 2. (Стройка вместо массива. НЕ рабочий) index.php:
Варинат 3. (CURLOPT_POST после CURLOPT_POSTFIELDS. НЕ рабочий) index.php:
Добавлено через 3 минуты и 45 секунд ЗЫ: статья по заголовкам хорошая. Спасибо. Это сообщение отредактировал(а) slva2000 - 27.11.2009, 09:45 |
||||||||
|
|||||||||
| Pitlord |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 31.10.2009 Репутация: 1 Всего: 7 |
Ты пытаешься формировать POST-запрос для Content-type "application/x-www-form-urlencoded", а для "multipart/form-data" он формируется абсолютно по-другому, читай статью, что я привёл. К тому же символ "@" — просто специальное обозначение cURL'а, он с протоколом HTTP не связан. Не знаю, лень проверять. Вообще флаг CURLOPT_POST необязательно ставить, он выставится автоматически при непустом CURLOPT_POSTFIELDS или CURLOPT_FILE |
|||
|
||||
| slva2000 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Pitlord спасибо. На счёт "варинат 2" понял. Я так и подозревал, но думал, может контент-тип можно указать в строке?
Но и так не сработало...
а вот очень зря. В мануале написано: порядок curl_setopt не имеет значения. Но в примере, который я привёл и проверил, оказывается имеет. Замечу, при посылке ПОСТ запросов с параметрами в строке (без передачи файла, и с Цонтент-тыпе Content-type "application/x-www-form-urlencoded") порядок действительно не имеет значения. А если параметры массив - и ....multipart/form-data - то, строго так как я говорил. Не поленись, проверь пожалуйста. Это парадокс! |
||||
|
|||||
| Pitlord |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 31.10.2009 Репутация: 1 Всего: 7 |
Ну, в принципе, согласно документации, если ты передаёшь массив параметру CURLOPT_POSTFIELDS, то Content-type станет "multipart/form-data":
А CURLOPT_POST устанавливает Content-type "application/x-www-form-urlencoded":
, поэтому при загрузке файлов CURLOPT_POST вообще не надо устанавливать. Я проверил на версии PHP 5.2.5 — действительно во втором случае "application/x-www-form-urlencoded" и данные POST-запроса вообще обнуляются (Content-length: 0). Это сообщение отредактировал(а) Pitlord - 28.11.2009, 22:27 |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Сеть | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |