使用curl POST二进制文件

问题描述 投票:2回答:1

我有一个基本的上传表单,我想用cURL模拟。

<?php
$params = array(
    'api_key' => $api_key,
    'api_secret' => $api_secret,
    'urls' => null,
    'uids' => 'all',
    'detector' => 'Aggressive',
    'namespace' => 'face.auth');

$action = $url . '?' . http_build_query($params);
?>

<form enctype="multipart/form-data" method="post" action="<?php echo $action; ?>">  
    <input type="file" name="upload" id="upload">
    <input type="submit" />
</form>

我知道如何使用cURL发布,但我不确定如何发布图像数据(这些数据作为二进制数据存储在数据库中,我们称之为$binary)。如下所示,将$binary作为一个后场传球不起作用。我看过一些例子,它们将@放在文件名/路径的前面,并将其作为一个帖子发送。但是,这对我来说似乎不起作用(因为我处理的是二进制数据,而不是文件名/路径)。

$params = array(
    'api_key' => $api_key,
    'api_secret' => $api_secret,
    'urls' => null,
    'uids' => 'all',
    'detector' => 'Aggressive',
    'namespace' => 'face.auth',
    $binary);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);      
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

var_dump($data);

?>

我也尝试过:

    $params = array(
            'api_key' => $api_key,
            'api_secret' => $api_secret,
            'urls' => null,
            'uids' => 'all',
            'detector' => 'Aggressive',
            'namespace' => 'face.auth');


$action = $url . '?' . http_build_query($params);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $action);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $binary);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

任何援助将不胜感激。

php curl http-post
1个回答
0
投票

没有必要构建像@Piskvor在POST a file string using cURL in PHP?中构建的完整数据字符串来实现这一点......我们可以通过在数组中传递二进制数据来实现这一点...

由于卷曲在内部做同样的字符串构建“Piskvor”在上述问题中做了什么...

当curl在postfield中获取数组时,curl会将该数据视为“multipart / form-data”

但要实现这一点,我们只需要在我们传递二进制数据的数组键中进行小修复...请检查下面你需要传递binaryData如下....并且你将在远程$ _files数组中得到这个网址

$params['image";filename="image'] = $binaryData

现在,它是如何实现的:

只有在curl构建的post字符串中获取filename =“some_name”属性时,远程服务器才能识别文件的发布数据.... curl会在@filepath的情况下自动添加它,但是当你将它作为二进制数据传递时它不能理解它是文件...所以我们得到post数组中的二进制内容而不是文件数组....

如果您的代码中的小变化不起作用,请告诉我....因为它对我有用...我喜欢分享这个......

© www.soinside.com 2019 - 2024. All rights reserved.