Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中未在cURL POST中正确传递CSV文件_Php_Csv_Curl_Post - Fatal编程技术网

在PHP中未在cURL POST中正确传递CSV文件

在PHP中未在cURL POST中正确传递CSV文件,php,csv,curl,post,Php,Csv,Curl,Post,我试图向API发送一个POST请求,在该请求的一部分,我添加了一个CSV文件,以根据我提供的电子邮件和数字获取返回令牌。前几行代码使用我从数据库中检索到的数据,生成文件并用文本数据填充是正确的。问题是我的卷发。当我在PostMan中发出这个请求时,结果非常好,我实际上使用了PostMan生成的PHP curl代码来编写这个请求。但是, filename=\"".$filename."\"\r\n 由于某种原因,不会显示之前正确填充的文件,并且API日志显示该文件中没有数据。这两个文件都位于同

我试图向API发送一个POST请求,在该请求的一部分,我添加了一个CSV文件,以根据我提供的电子邮件和数字获取返回令牌。前几行代码使用我从数据库中检索到的数据,生成文件并用文本数据填充是正确的。问题是我的卷发。当我在PostMan中发出这个请求时,结果非常好,我实际上使用了PostMan生成的PHP curl代码来编写这个请求。但是,

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会认为它是空白的。我不知道数据必须单独通知服务器