发送字符串以“开始”@&引用;在php中,卷曲为字符串

发送字符串以“开始”@&引用;在php中,卷曲为字符串,php,curl,telegram-bot,Php,Curl,Telegram Bot,我正在尝试使用php使用CURLPOST方法发送一个字符串,如“@mystr”,但如果我只是使用以下代码发送: $url_str = $url->getUrl(); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url_str); curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch,

我正在尝试使用php使用
CURL
POST方法发送一个字符串,如
“@mystr”
,但如果我只是使用以下代码发送:

        $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():不推荐使用@filename API进行文件上载。请改用CURLFile类

注意:$字段如下所示:

$fields=['chat_id'=>'@someusername','text'=>'hello'];
这是用于电报机器人api的,如果我在GET方法中使用
%40
而不是
@
,它将是正常的,电报将把我的消息发送到我的频道,但我必须使用POST方法


是否仍然可以发送以CURL中的
@
开头的字符串?

我在这里找到了解决方案:

CURLOPT\u SAFE\u上传

如果为TRUE,则禁用对用于在CURLOPT_POSTFIELDS中上载文件的@前缀的支持,这意味着以@开头的值可以安全地作为字段传递。卷曲文件可以用于上传

在PHP5.5.0中添加,默认值为FALSE。PHP5.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);
$url\u str=$url->getUrl();
$ch=curl_init();

curl_setopt($ch,CURLOPT_SAFE_UPLOAD,TRUE)//@Jan no it's not,this not the CURL this is PHP CURL classist在GET参数或URI字符串中使用
@
是违反RFC标准的,除非它用于表示资源路径之前的信息,例如URI
ftp://user:pass@ftp.domain.com/folder
。发帖是另一回事,但只是想解释一下为什么在GET中必须使用
%40
。这个问题是另一个问题的重复,而不是Jan提出的问题。在正确的复制标志上等待一秒钟。@Omid:php curl的可能复制只是命令行curl使用的完全相同的库的包装。行为本质上是相同的
@
在任何字段值的开头都有一个表示文件上载的curl快捷方式。如果您不想将该
@
视为文件上载,则必须对其进行url编码。