PHP - POST 请求二进制 body 数据 - 适用于 CURL,但不适用于 Laravel
PHP - POST request with binary body data - Works with CURL, but not with Laravel
我要向以下第 3 方 API 发布图片。
他们要求 header 的 content-type 必须设置为:Content-Type: image/jpeg
,并且 body 包含实际图像的二进制数据。
下面我在 PHP 中使用 cURL 发出此请求 - 这很好用:
$url = "examle.org/images";
$pathToFile = "myfile.jpeg";
$auth = "Authorization: Bearer <Token>";
$auth = "Authorization: Bearer " . $this->token;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($pathToFile));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: image/jpeg', $auth]);
$result = curl_exec($ch);
以上 POST 使用 cURL 工作正常:我收到 200 响应成功错误。我想,为了让它更“Laravel-like”,我会使用 Laravel 的 HTTP facade (Guzzle):
$post = Http::withHeaders(['Content-Type' => 'image/jpeg'])
->withToken("<Token>")
->attach('file', file_get_contents($pathToFile), 'myfile.jpeg')
->post($url);
以上没有按预期工作。第 3 方 API 服务 return 400 响应并告诉我它无法读取图像文件。
我做错了什么?
我会尝试withBody
$post = Http::withBody(file_get_contents($pathToFile), 'image/jpeg')
->withToken("<Token>")
->post($url);
我要向以下第 3 方 API 发布图片。
他们要求 header 的 content-type 必须设置为:Content-Type: image/jpeg
,并且 body 包含实际图像的二进制数据。
下面我在 PHP 中使用 cURL 发出此请求 - 这很好用:
$url = "examle.org/images";
$pathToFile = "myfile.jpeg";
$auth = "Authorization: Bearer <Token>";
$auth = "Authorization: Bearer " . $this->token;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($pathToFile));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: image/jpeg', $auth]);
$result = curl_exec($ch);
以上 POST 使用 cURL 工作正常:我收到 200 响应成功错误。我想,为了让它更“Laravel-like”,我会使用 Laravel 的 HTTP facade (Guzzle):
$post = Http::withHeaders(['Content-Type' => 'image/jpeg'])
->withToken("<Token>")
->attach('file', file_get_contents($pathToFile), 'myfile.jpeg')
->post($url);
以上没有按预期工作。第 3 方 API 服务 return 400 响应并告诉我它无法读取图像文件。
我做错了什么?
我会尝试withBody
$post = Http::withBody(file_get_contents($pathToFile), 'image/jpeg')
->withToken("<Token>")
->post($url);