PHP curl方法可以在同一个请求中上传文件和带有前导@字符的字符串吗?

use*_*628 5 php curl

我想使用PHP curl_*方法构造一个POST请求,它执行以下操作:

  1. 上传文件(因此请求必须以multipart/form-data的形式提交)
  2. 发送一串文本,其中字符串以"@"字符开头

例如,以下代码有效,因为文本字符串中没有前导"@"字符:

<?php

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => 'text_to_upload'
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com/upload-test');
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_exec($curl);
curl_close($curl);

?>
Run Code Online (Sandbox Code Playgroud)

但是,如果字符串以"@"字符开头,则会中断,这会导致curl查找名为"text_to_upload"的不存在的文件(请注意,唯一的更改是在upload_text字段中添加前导"@"字符):

<?php

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => '@text_to_upload'
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com/upload-test');
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_exec($curl);
curl_close($curl);

?>
Run Code Online (Sandbox Code Playgroud)

那么......在使用PHP中的curl_*方法同时上传文件时,是否可以发送带有前导"@"字符的文本?

最终结果(如果可能)应该相当于curl的命令行使用:

curl -F 'upload_=@file_to_upload.png' --form-string 'upload_text=@text_to_upload' 'http://example.com/upload-test'
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ale*_*der 0

替代方案1

您很可能必须对参数进行urlencode 。

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => urlencode('@text_to_upload')
);
Run Code Online (Sandbox Code Playgroud)

另外,在服务器端进行 urldecode 。

替代方案2

upload_text无论其内容如何,​​只需在开头添加一个空格即可。

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => ' @text_to_upload'
);
Run Code Online (Sandbox Code Playgroud)