PHP -带有二进制体数据的POST请求-适用于CURL,但不适用于Laravel

lg40wkob  于 2023-04-13  发布在  PHP
关注(0)|答案(2)|浏览(151)

我有下面的第三方API,我张贴的图像。
它们要求标头的content-type必须设置为:Content-Type: image/jpeg,并且主体包含实际图像的二进制数据。
下面我在PHP中使用cURL发出这个请求-this works fine

$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);

使用cURL的上述POST工作正常:我得到了一个200响应成功的错误。我想,为了让它更“像Laravel”,我会使用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服务返回400响应,并告诉我它无法读取图像文件。
我做错了什么?

50few1ms

50few1ms1#

我想试试withBody

$post = Http::withBody(file_get_contents($pathToFile), 'image/jpeg')
      ->withToken("<Token>")
      ->post($url);
kmbjn2e3

kmbjn2e32#

下面的代码为我工作,我试图使我创建的一个zip文件的放置请求,这不是下面的代码的路径,但下面的代码说明了我如何能够获得zip文件的完整路径,并利用它与withBody函数,它的工作原理.

$zipFileName = 'public/memes/' . Str::random(11) . ".zip";
$zipFilePath = Storage::path($zipFileName);
// e.g. C:/laragon/www/laravel-project/storage/app/public/memes/xl26SNa6p3h.zip

Http::withBody(file_get_contents($zipFilePath), 'application/zip')
->withToken($token)
->put($url);

我希望它有帮助。

相关问题