我正在尝试使用cURL在基于Laravel构建的端点中发布数据。在我接收数据的API控制器中,我可以接收除媒体文件以外的所有数据。我使用$request->hasFile('file')
检查文件是否存在,但返回false。我还尝试使用$request->file('file')
获取文件,但它返回null。
当我使用$request->get('file')
时,得到以下响应。
Laravel:5.5
PHP 7.2.1
文件”:{“名称”:“ /用户/名称/文件/路径/public/media/aaaah.wav”,“哑剧”:null,“邮编”:null}
下面,我使用$headers[] = "Content-Type: application/json";
将收件人从数组转换为字符串。有人可以帮助我理解为什么当我使用$request->hasFile('file')
和$request->file('file')
时在Laravel方法中没有收到cURL发布的文件吗?
AppController
public function postCurlData()
{
$endPoint = 'http://127.0.0.1:9000/api';
$apiKey = '****';
$url = $endPoint . '?key=' . $apiKey;
$dir = '/Users/name/File/path/app/public/media/test.wav'; // full directory of the file
$curlFile = curl_file_create($dir);
$data = [
'recipient' => ['44909090', '44909090'],
'content' => 'i love to code',
'file' => $curlFile,
];
$ch = curl_init();
$headers = array();
$headers[] = "Content-Type: application/json";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$result = curl_exec($ch);
$result = json_decode($result, TRUE);
curl_close($ch);
}
我正在接收数据的端点:
APIController
public function receiveCurlData()
{
$apiKey = $request->get('key');
if (($apiKey)) {
return response()->json([
'status' => 'success',
'content' => $request->get('content'),
'recipient' => $request->get('recipient'),
'file' => $request->hasFile('file')
]);
}
}
回复
{"status":"success","content":"I love to code","recipient":
["44909090","44909090"],"file":false}
答案 0 :(得分:1)
如果您要发送文件,则建议您设置卷曲安全上传:
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
然后,您可能需要更改标题的Content-Type并进行以下设置:
"Content-Type: multipart/form-data"
我通常也使用这种方法代替curl_file_create
if ( class_exists('CurlFile') ) {
$file = new CurlFile('path-to-the-file', 'application/octet-stream');
} else {
$file = '@' . realpath('path-to-the-file');
}
无论如何,我会(但不能完全确定)说您代码的问题是Content-Type标头,该标头设置为JSON