在PHP中未在cURL POST中正确传递CSV文件
我试图向API发送一个POST请求,在该请求的一部分,我添加了一个CSV文件,以根据我提供的电子邮件和数字获取返回令牌。前几行代码使用我从数据库中检索到的数据,生成文件并用文本数据填充是正确的。问题是我的卷发。当我在PostMan中发出这个请求时,结果非常好,我实际上使用了PostMan生成的PHP curl代码来编写这个请求。但是,在PHP中未在cURL POST中正确传递CSV文件,php,csv,curl,post,Php,Csv,Curl,Post,我试图向API发送一个POST请求,在该请求的一部分,我添加了一个CSV文件,以根据我提供的电子邮件和数字获取返回令牌。前几行代码使用我从数据库中检索到的数据,生成文件并用文本数据填充是正确的。问题是我的卷发。当我在PostMan中发出这个请求时,结果非常好,我实际上使用了PostMan生成的PHP curl代码来编写这个请求。但是, filename=\"".$filename."\"\r\n 由于某种原因,不会显示之前正确填充的文件,并且API日志显示该文件中没有数据。这两个文件都位于同
filename=\"".$filename."\"\r\n
由于某种原因,不会显示之前正确填充的文件,并且API日志显示该文件中没有数据。这两个文件都位于同一个目录中,所以我真的不知道我做错了什么
$file = fopen($filename, "w");
while ($row2 = mysqli_fetch_array($query2)){
$txt = "$row2[email], $row2[firstname], $row2[lastname],
$row[company], $row2[mobilephone]\n";
echo $txt;
fwrite($file, $txt);
}
$curl = curl_init();
echo $filename."\n";
curl_setopt_array($curl, array(
CURLOPT_URL => "https://example.com",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
Content-Disposition: form-data;
name=\"token\"\r\n\r\12345\r\n
------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
Content-Disposition: form-data; name=\"datafile\";
filename=\"".$filename."\"\r\n
Content-Type: text/csv\r\n\r\n\r\n
------WebKitFormBoundary7MA4YWxkTrZu0gW--",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
有人能看出我在这里做错了什么吗
注意:出于隐私/安全原因,我用虚拟数据替换了几个字段和字符串
API日志显示该文件中没有数据
原因是您告诉我们您将在查询中发送“filename.txt”,但实际上并不发送数据
例如,如果通过POST查询发送带有| | | test |
内容的filename.txt
,则结果查询如下:
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe
Content-Disposition: form-data; name="token"
12345
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe
Content-Disposition: form-data; name="datafile"; filename="filename.txt"
Content-Type: text/plain
||test||
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe--
如您所见,应该将文件的内容添加到查询中。在您的查询中只有一个声明,即带有$filename
名称的文件将被发送,其内容将在稍后发送,但根本没有内容:
------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
Content-Disposition: form-data; name=\"datafile\";
filename=\"".$filename."\"\r\n
Content-Type: text/csv\r\n\r\n\r\n
所以服务器将回答该文件为空
若要发送文件,可以稍后添加内容(如我的示例所示),但这是一种糟糕的方法。根据您的要求,您应该使用另一种技术来发送文件数据。发送带有变量filename
的数组,该变量带有前缀为@
的文件路径,或使用CURLFile
(类似)
API日志显示该文件中没有数据
原因是您告诉我们您将在查询中发送“filename.txt”,但实际上并不发送数据
例如,如果通过POST查询发送带有| | | test |
内容的filename.txt
,则结果查询如下:
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe
Content-Disposition: form-data; name="token"
12345
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe
Content-Disposition: form-data; name="datafile"; filename="filename.txt"
Content-Type: text/plain
||test||
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe--
如您所见,应该将文件的内容添加到查询中。在您的查询中只有一个声明,即带有$filename
名称的文件将被发送,其内容将在稍后发送,但根本没有内容:
------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
Content-Disposition: form-data; name=\"datafile\";
filename=\"".$filename."\"\r\n
Content-Type: text/csv\r\n\r\n\r\n
所以服务器将回答该文件为空
若要发送文件,可以稍后添加内容(如我的示例所示),但这是一种糟糕的方法。根据您的要求,您应该使用另一种技术来发送文件数据。使用变量filename
发送数组,其中任何一个路径都指向前缀为@
的文件,或者使用CURLFile
(类似)我想不出任何(合理的)理由来手动执行多部分/表单数据编码,而让curl为您编码是件小事。整个curl_setopt_数组可以替换为
curl_setopt_array ( $curl, array (
CURLOPT_URL => "https://example.com",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_POST=>true,
CURLOPT_POSTFIELDS => array (
'token' => '12345',
'datafile' => new CURLFile ( $filename, 'text/csv', 'datafile' )
),
CURLOPT_HTTPHEADER => array (
"cache-control: no-cache"
)
) );
- curl将为您进行多部分/表单数据编码
我想不出任何(合理的)理由来手动进行多部分/表单数据编码,而让curl为您进行编码是件小事。整个curl_setopt_数组可以替换为
curl_setopt_array ( $curl, array (
CURLOPT_URL => "https://example.com",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_POST=>true,
CURLOPT_POSTFIELDS => array (
'token' => '12345',
'datafile' => new CURLFile ( $filename, 'text/csv', 'datafile' )
),
CURLOPT_HTTPHEADER => array (
"cache-control: no-cache"
)
) );
- curl将为您进行多部分/表单数据编码
传递字符串而不是and array或json的任何原因?我只是在他们的应用程序中成功创建调用后使用Postman生成的PHP curl代码。传递字符串而不是and array或json的任何原因?我只是在他们的应用程序中成功创建调用后使用Postman生成的PHP curl代码applicationIt将作为表单数据发送,而不仅仅是一个纯文件。这就是邮递员以这种方式生成它的原因。问题是在解释之前填充$filename
时,API会认为它是空白的。我不知道数据必须单独通知服务器,因为它是作为表单数据而不是单纯的文件发送的。这就是邮递员以这种方式生成它的原因。问题是在解释之前填充$filename
时,API会认为它是空白的。我不知道数据必须单独通知服务器