За последние 24 часа нас посетили 44379 программистов и 2954 робота. Сейчас ищут 1042 программиста ...

CURL. Отправляется GET вместо POST

Тема в разделе "PHP для новичков", создана пользователем Сереганек, 13 окт 2017.

  1. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    Хочу отправить файл на удаленный сервак с подменой MIME-типа. Но почему-то вместо POST уходят GET-запросы. Хотя CURLOPT_POST установил в TRUE. Что здесь не так?

    PHP:
    1. <?php
    2.  
    3.     $username = "password";
    4.     $password = "login";
    5.     $url = "http://10.4.0.11:80/php/mimecheck.php";
    6.     $fileLocation = "/var/www/mime.com/sendfile/info.php";
    7.  
    8.     if (!is_file($fileLocation)){
    9.         echo "Файл не найден";
    10.         exit();
    11.     }
    12.  
    13.     $data = array(
    14.         'file' => new CURLFile($fileLocation,'image/jpeg','img')
    15.     );
    16.  
    17.     $curl = curl_init($url);
    18.     curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    19.     curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password);
    20.     curl_setopt($curl,CURLOPT_POST, TRUE);
    21.     curl_setopt($curl, CURLOPT_UPLOAD, TRUE);
    22.     curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    23.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    24.  
    25.     $response = curl_exec($curl);
    26.     if (curl_errno($curl)){
    27.         echo '<span style="color:red">';
    28.         echo curl_error($curl);
    29.         echo '</span>';
    30.     } else {
    31.         echo '<span style="color:green">';
    32.         echo $response;
    33.         echo '</span>';
    34.     }
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Сереганек нравится это.
  3. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    запустил скрипт в браузере и увидел в запросах
     

    Вложения:

    • 16.jpg
      16.jpg
      Размер файла:
      49,1 КБ
      Просмотров:
      8
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ты не увидишь в браузере, какой запрос отправляется из curl, он отправляется на сервере
     
    Сереганек нравится это.
  5. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    Еще добавил заголовок, но тип файла в запросе не меняется. Скорее всего причина обоих проблем в чем-то одном.
    PHP:
    1.     $headers = array(
    2.         "Content-type: text/xml;charset=\"utf-8\""
    3.     );
    4.     curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    Заголовок добавил сразу после строки CURLOPT_UPLOAD
    --- Добавлено ---
    а, это ж ГЕТ - запрос к самому скрипту. Понял
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Сереганек, в браузере ты никак не можешь видеть, какой запрос шлеться от курла. Эта кухня работает на сервере.
     
    Сереганек нравится это.
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.870
    Симпатии:
    753
    Адрес:
    Татарстан
    тупо сделай на сервере логирование
    типа залогируй в текстовик $_GET и $_POST
    и увидишь что у тебя на сервер передается ))))
     
    Сереганек нравится это.
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это хорошо если есть доступ к северу-получаетелю запроса).

    @Сереганек,
    PHP:
    будет показывать инфу о запросе, метод запроса будет или нет.
     
    Сереганек нравится это.
  9. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    Доступ к серваку-получателю есть. Сейчас посмотрю что туда передается.
     
  10. igor_zakutynsky

    igor_zakutynsky Новичок

    С нами с:
    13 окт 2017
    Сообщения:
    2
    Симпатии:
    0
    Запусти для тестирования ngrok, и посмотри что туда уходит
     
  11. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    На сервере-получателе вывел в файл заголовки и содержимое $_GET, $POST, $_REQUEST
    Заголовки показали (выводил через getallheaders()) :
    HTML:
    1. Host: 10.4.0.9
    2. Authorization: Basic aW5qZWN0aW9uOjBwYzIybWZn
    3. Accept: */*
    4. Transfer-Encoding: chunked
    5. Expect: 100-continue
    А в $_GET, $POST, $_REQUEST вообще пусто.
    $_SERVER[REQUEST_METHOD] почему-то равен PUT. Странная картина.
    На сервере, откуда идет отправка файла, посмотрел содержимое в curl_getinfo().
    Там тоже что-то странное:
    HTML:
    1. ["content_type"]=>
    2.   string(24) "text/html; charset=UTF-8"
    Хотя я контент тайп меняю на xml :
    PHP:
    1. $headers = array(
    2.         "Content-type: text/xml;charset=\"utf-8\""
    3.     );
    4.     curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.870
    Симпатии:
    753
    Адрес:
    Татарстан
    походу оно у тебя авторизацию не проходит
     
  13. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    Проходит. Если я закомментирую строки для авторизации, то получаю 401 еще в консоли при отправке запроса. И текстовый файл не создается. Ну логично ведь, если я получил лог, который генерится в принимающем запрос скрипте, значит авторизация пройдена. В заголовках Authorization: Basic aW5qZWN0aW9uOjBwYzIybWZn

    Вот мой оконсательный вариант кода:
    PHP:
    1. <?php
    2.  
    3.     $username = "login";
    4.     $password = "password";
    5.     $url = "http://10.4.0.9:80/php/mimecheck.php";
    6.     $fileLocation = "/var/www/mime.com/sendfile/info.php";
    7.  
    8.     if (!is_file($fileLocation)){
    9.         echo "Файл не найден";
    10.         exit();
    11.     }
    12.  
    13.     $data = array(
    14.         'file' => new CURLFile($fileLocation,'image/jpeg','img')
    15.     );
    16.  
    17.     $headers = array(
    18.         "Content-type: text/xml;charset=\"utf-8\""
    19.     );
    20.  
    21.     $curl = curl_init($url);
    22.     curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    23.     curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password);
    24.     curl_setopt($curl,CURLOPT_POST,TRUE);
    25.     curl_setopt($curl, CURLOPT_UPLOAD, TRUE);
    26.     curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    27.     curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    28.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    29.     $response = curl_exec($curl);
    30.  
    31.     if (curl_errno($curl)){
    32.         echo '<span style="color:red">';
    33.         echo curl_error($curl);
    34.         echo '</span>';
    35.     } else {
    36.         echo '<span style="color:green">';
    37.         echo $response;
    38.         echo '</span>';
    39.     }
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не надо отправлять файлы на удаленный сервак с подменой MIME.
    --- Добавлено ---
    Ссылка у меня в подписи, пункт 7.