Строка отправки начинается с @ в php curl как строка

Я пытаюсь отправить строку типа "@mystr" с php, используя метод CURL POST, но если я просто отправляю следующий код:

        $url_str = $url->getUrl();
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url_str);
        curl_setopt($ch, CURLOPT_POST, count($fields));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:multipart/form-data']);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

        $out = curl_exec($ch);
        curl_close($ch);

Он выдаст ошибку, которая говорит:

Устарело: curl_setopt(): использование API @filename для загрузки файлов устарело. Вместо этого используйте класс CURLFile...

Примечание. $fields выглядят примерно так:

$fields=['chat_id'=>'@someusername','text'=>'hello'];

Это для бота телеграммы API, если я использую %40 вместо @ в методе GET, все будет в порядке, и телеграмма отправит мое сообщение на мой канал, но я должен использовать метод POST.

Можно ли в CURL отправлять строки, начинающиеся с @?


person Omid    schedule 16.11.2015    source источник
comment
Возможный дубликат stackoverflow .com/questions/10060093/   -  person Jan    schedule 16.11.2015
comment
@Jan Ян, нет, это не тот CURL, это класс PHP curl   -  person Omid    schedule 16.11.2015
comment
Использование @ в параметре GET или строке URI противоречит стандартам RFC, если только оно не используется для обозначения информации перед путем к ресурсу, например, в URI ftp://user:[email protected]/folder. Публикация — это отдельная история, но я просто хотел объяснить, почему вы были вынуждены использовать %40 в GET. Этот вопрос является дубликатом другого, но не того, который пометил Ян. Одна секунда на правильном флаге дублирования....   -  person skrilled    schedule 16.11.2015
comment
Возможный дубликат PHP + curl, образец кода HTTP POST?   -  person skrilled    schedule 16.11.2015
comment
@Omid: php curl — это просто оболочка для той же самой библиотеки, которую использует curl из командной строки. поведение практически идентично. @ в начале значения ЛЮБОГО поля — это ярлык curl, обозначающий загрузку файла. если вы хотите, чтобы @ НЕ рассматривалось как загрузка файла, вы должны закодировать его в URL-адресе.   -  person Marc B    schedule 16.11.2015
comment
посмотрите, я использую urlencode, но телеграмма не будет декодировать его с помощью почтового метода, телеграмма просто декодирует наши параметры только тогда, когда мы используем метод GET, и если мне нужно отправить свои файлы на мой канал, это вообще невозможно с GET, потому что точка параметра имя пользователя канала должно содержать chat_id или имя пользователя канала, а имя пользователя канала должно начинаться с @   -  person Omid    schedule 16.11.2015
comment
@marcB есть идеи?   -  person Omid    schedule 16.11.2015


Ответы (1)


Я нашел решение здесь: http://php.net/manual/en/function.curl-setopt.php

CURLOPT_SAFE_UPLOAD

TRUE, чтобы отключить поддержку префикса @ для загрузки файлов в CURLOPT_POSTFIELDS, что означает, что значения, начинающиеся с @, можно безопасно передавать в качестве полей. Вместо этого для загрузки можно использовать CURLFile.

Добавлено в PHP 5.5.0 со значением FALSE по умолчанию. PHP 5.6.0 изменяет значение по умолчанию на TRUE.

    $url_str = $url->getUrl();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, TRUE); //<- HERE
    curl_setopt($ch, CURLOPT_URL, $url_str);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:multipart/form-data']);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $out = curl_exec($ch);
    curl_close($ch);
person Omid    schedule 16.11.2015