通过php curl调用在API中获取post数据时出现问题

通过php curl调用在API中获取post数据时出现问题,php,curl,slim,Php,Curl,Slim,我正试图通过curl-PHP向slimapi发送一个文件 实际上,我有一个PHP文件,它接收来自post的数据,并假设使用接收到的数据调用一个slim API,slim API将数据存储在数据库中。当数据中没有文件时,它可以正常工作,但当我使用PHP curl将文件和其他数据一起发送到API并设置“content type:multipart/form data”时,我会错过API端中所有发布的数据。我想不出它出了什么问题 顺便说一下,当我用postman测试API时,它工作得很好。API成功获

我正试图通过curl-PHP向slimapi发送一个文件

实际上,我有一个PHP文件,它接收来自post的数据,并假设使用接收到的数据调用一个slim API,slim API将数据存储在数据库中。当数据中没有文件时,它可以正常工作,但当我使用PHP curl将文件和其他数据一起发送到API并设置“content type:multipart/form data”时,我会错过API端中所有发布的数据。我想不出它出了什么问题

顺便说一下,当我用postman测试API时,它工作得很好。API成功获取文件并将其保存在存储器中。问题一定出在客户端,我在客户端使用curl和PHP调用API

有人能帮我设置curl调用以使API工作吗

非常感谢

route.php

$app->post('/softwareskills/insert', SoftwareSkillsController::class . ':insert')->setName('SoftwareSkills.insert');
SoftwareSkillsController.php

class SoftwareSkillsController {


    public function insert(Request $request, Response $response, array $args)
    {

            $params= $request->getParsedBody();
            $file = $request->getUploadedFiles();
            var_dump($params); // return empty array!
            var_dump($file); // return empty array!

    }
}
upload.php

<?php
     // $_POST and $_FILES to send them via php CURL

$tmpfile = $_FILES['attachment']['tmp_name'];
$filename = basename($_FILES['attachment']['name']);
$filemime = $_FILES['attachment']['type'];

$data = array(
    "StNo" => $_POST['StNo'],
    "SoftwareName" =>  $_POST['SoftwareName'],
    "proficiency" => $_POST['proficiency'],
    "attachment" => new CURLFile($tmpfile,$filemime,$filename)
);

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => "http://myapi.com/softwareskills/insert",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => http_build_query($data),
    CURLOPT_HTTPHEADER => array(
        "content-type: multipart/form-data"
    ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}

不要自己设置内容类型头,让cURL自己处理<代码>多部分/表单数据
本身没有什么意义,它需要包含请求主体中用于将参数彼此分离的边界。cURL本身应该设置正确的值,包括边界。如果我从标题中删除内容类型,则在API端
$params
提供发布的数据,但
$file
仍然为空,我无法保存上传的文件!我的代码怎么了?!我删除了
http\u build\u query
content-type:multipart/form-data
,它成功了!感谢您的宝贵意见@04FS!或者,如果您不介意使用第三方库,您可以查看它,使post请求停止尝试自己设置内容类型头,并让cURL自己处理<代码>多部分/表单数据本身没有什么意义,它需要包含请求主体中用于将参数彼此分离的边界。cURL本身应该设置正确的值,包括边界。如果我从标题中删除内容类型,则在API端
$params
提供发布的数据,但
$file
仍然为空,我无法保存上传的文件!我的代码怎么了?!我删除了
http\u build\u query
content-type:multipart/form-data
,它成功了!感谢您的宝贵意见@04FS!或者,如果您不介意使用第三方库,您可以查看它以发出post请求